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 poskytnelibpod
-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.