GNU/Linux >> Znalost Linux >  >> Linux

Prozkoumání Podman RESTful API pomocí Pythonu a Bash

Možná jste slyšeli, že Podman V2 má nové RESTful API. Tento dokument demonstruje API pomocí příkladů kódu v Pythonu a příkazech shellu. Další poznámky jsou zahrnuty v komentářích ke kódu. Poskytnutý kód byl napsán tak, aby byl jasný v porovnání s kvalitou výroby.

Požadavky

  • Máte nainstalovaný Python>3.4.
  • Nainstalovali jste knihovnu požadavků Pythonu.
    • poznámky k instalaci
  • Doporučujeme IDE pro úpravy Pythonu.
  • Dvě okna terminálu:jedno pro spuštění služby Podman a kontrolu informací o ladění, druhé okno pro spouštění skriptů.
  • Je ukázáno použití příkazů curl a jq.
  • Adresy URL připojení si můžete prohlédnout zde.

Začínáme

Služba

Pro tyto příklady spouštíme službu Podman jako normální uživatel a na nezabezpečeném čísle portu TCP/IP.

Pro produkci by služba Podman měla používat protokol aktivace socketu systemd. To umožňuje Podmanu podporovat klienty bez dalších démonů a zabezpečit koncový bod přístupu.

Následující příkaz spustí službu Podman na portu 8080 bez vypršení časového limitu. Budete muset zadat ^C do tohoto okna terminálu, když skončíte s výukovým programem.

# podman system service tcp:localhost:8080 --log-level=debug --time=0

Kromě soketu TCP ukázaného výše služba Podman podporuje běh pod protokolem aktivace soketu systemd a sokety domény Unix (UDS).

[ Také by se vám mohlo líbit: Nahlédnout:Nové rozhraní REST API společnosti Podman ]

Kód Pythonu

Zdroj informací

Následující text nám ukazuje informace o službě Podman a hostiteli:

import json
import requests


response = requests.get("http://localhost:8080/v1.40.0/libpod/info")

Hluboký ponor

  • requests.get() volá požadavky knihovny předat adresu URL službě Podman pomocí metody GET HTTP.
    • požadavky knihovna poskytuje pomocné metody pro všechny oblíbené metody HTTP.
  • http://localhost:8080 odpovídá vyvolání služby Podman výše.
  • /v1.40.0 označuje verzi API, kterou používáme.
  • /libpod označuje, že očekáváme, že služba poskytne libpod -specifická návratová nosnost.
    • Nepoužití tohoto prvku způsobí, že server vrátí kompatibilní obsah.
  • /info určuje zdroj, na který se dotazujeme.

Zajímavé čtení, ale bez výstupu, jak víme, že to fungovalo?

Získání výstupu

Připojte řádky níže a nyní můžete vidět verzi Podman běžící na hostiteli:

response.raise_for_status()


info = json.loads(response.text)
print(info.version.Version)
  • raise_for_status() vyvolá výjimku, pokud stavový kód není mezi 200 a 399.
  • json.loads() dekóduje tělo HTTP odpovědi na objekt/slovník.

Po spuštění je výstup:

2.1.0-dev

Následující funguje ze shellu:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version


"2.1.0-dev"

Výpis kontejnerů

import json
import requests


response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()


ctnrs = json.loads(response.text)
for c in ctnrs:
    print(c.Id)

json.loads() dekóduje tělo HTTP do pole objektů/slovníků, program pak vypíše ID každého kontejneru. Například:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id


"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"

Pokud je parametr dotazu all=true nebyly poskytnuty, pak by byly uvedeny pouze běžící kontejnery. Dotazy na zdroje a parametry pro API jsou zdokumentovány zde.

Něco užitečného

Podívali jsme se na pár příkladů, ale co takhle něco trochu užitečnějšího? Dokončili jste vývoj dalšího skvělého kontejneru a níže uvedený skript odstraní vše z vašeho místního úložiště. (Pokud chcete ušetřit na psaní clean_storage.py)

#!/usr/bin/env python
import json


import requests


# Clean up local storage by removing all containers, pods, and images.  Any error will
#   abort the process


confirm = input("Really delete all items from storage? [y/N] ")
if str(confirm).lower().strip() != 'y':
    exit(0)


# Query for all pods in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/pods/json")
response.raise_for_status()


pods = json.loads(response.text)
# Workaround for https://github.com/containers/podman/issues/7392
if pods is not None:
    for p in pods:
        # For each container: delete container and associated volumes
        response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/pods/{p['Id']}?force=true")
        response.raise_for_status()
    print(f"Removed {len(pods)} pods and associated objects")
else:
    print(f"Removed 0 pods and associated objects")


# Query for all containers in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()


ctnrs = json.loads(response.text)
for c in ctnrs:
    # For each container: delete container and associated volumes
    print(c.keys())
    response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/containers/{c['Id']}?force=true&v=true")
    response.raise_for_status()
print(f"Removed {len(ctnrs)} containers and associated objects")


# Query for all images in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/images/json")
response.raise_for_status()


imgs = json.loads(response.text)
for i in imgs:
    # For each image: delete image and any associated containers
    response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/images/{i['Id']}?force=true")
    response.raise_for_status()
print(f"Removed {len(imgs)} images and associated objects")

[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]

Shrnutí

Doufám, že vám to pomůže. Dokumentace API vám poskytuje všechny zdroje a požadované metody. Jsou zahrnuta vstupní a výstupní těla a také stavové kódy.

Kód Podman je ve fázi intenzivního vývoje a uvítáme vaše připomínky k problémům a žádostem o stažení na stránce projektu GitHub.


Linux
  1. Jak vytvořit Bash skripty pomocí externích proměnných a vložených skriptů

  2. Jak trasovat Python skripty pomocí trace.py

  3. Pomocí a ve smyčce Bash while

  1. Historie API:GitLab Runner a Podman

  2. OpenCV a python/virtualenv?

  3. Kdy použít Bash a kdy Perl/Python/Ruby?

  1. Používání souborů a zařízení v kontejnerech Podman rootless

  2. Použití případových prohlášení v Bash

  3. najít a zkopírovat soubor pomocí Bash