Sie haben vielleicht gehört, dass Podman V2 eine neue RESTful-API hat. Dieses Dokument demonstriert die API anhand von Codebeispielen in Python und Shell-Befehlen. Zusätzliche Hinweise sind in den Codekommentaren enthalten. Der bereitgestellte Code wurde so geschrieben, dass er klar im Vergleich zur Produktionsqualität ist.
Anforderungen
- Sie haben Python>3.4 installiert.
- Sie haben die Bibliothek für Python-Anforderungen installiert.
- Installationshinweise
- Eine IDE zum Bearbeiten von Python wird empfohlen.
- Zwei Terminalfenster:eines zum Ausführen des Podman-Dienstes und zum Überprüfen von Debugging-Informationen, das zweite Fenster zum Ausführen von Skripten.
- Die Verwendung von curl- und jq-Befehlen wird demonstriert.
- Sie können Verbindungs-URLs hier überprüfen.
Erste Schritte
Der Dienst
Für diese Beispiele führen wir den Podman-Dienst als normaler Benutzer und auf einer ungesicherten TCP/IP-Portnummer aus.
Für die Produktion sollte der Podman-Dienst das Socket-Aktivierungsprotokoll von systemd verwenden. Dadurch kann Podman Clients ohne zusätzliche Daemons unterstützen und den Zugriffsendpunkt sichern.
Der folgende Befehl führt den Podman-Dienst auf Port 8080 ohne Zeitüberschreitung aus. Sie müssen ^C eingeben in dieses Terminalfenster, wenn Sie mit dem Tutorial fertig sind.
# podman system service tcp:localhost:8080 --log-level=debug --time=0
Zusätzlich zu dem oben gezeigten TCP-Socket unterstützt der Podman-Dienst die Ausführung unter dem Socket-Aktivierungsprotokoll von systemd und Unix-Domain-Sockets (UDS).
[ Das könnte Ihnen auch gefallen: Vorschau:Podmans neue REST-API]
Python-Code
Info-Ressource
Das Folgende zeigt uns Informationen über den Podman-Dienst und -Host:
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/info")
Ein tiefer Tauchgang
requests.get()
ruft die Anfragen auf Bibliothek, um die URL mithilfe der GET-HTTP-Methode an den Podman-Dienst zu übergeben.- Die Anfragen Die Bibliothek bietet Hilfsmethoden für alle gängigen HTTP-Methoden.
http://localhost:8080
stimmt mit dem obigen Aufruf des Podman-Dienstes überein./v1.40.0
bezeichnet die von uns verwendete API-Version./libpod
gibt an, dass wir erwarten, dass der Dienst einenlibpod
bereitstellt -spezifische Rückhollast.- Wenn Sie dieses Element nicht verwenden, gibt der Server eine kompatible Nutzlast zurück.
/info
gibt die Ressource an, die wir abfragen.
Interessant zu lesen, aber ohne Ergebnis, woher wissen wir, dass es funktioniert hat?
Ausgabe abrufen
Fügen Sie die folgenden Zeilen an, und Sie können jetzt die Version von Podman sehen, die auf dem Host ausgeführt wird:
response.raise_for_status()
info = json.loads(response.text)
print(info.version.Version)
raise_for_status()
löst eine Ausnahme aus, wenn der Statuscode nicht zwischen 200 und 399 liegt.json.loads()
decodiert den Text der HTTP-Antwort in ein Objekt/Wörterbuch.
Bei der Ausführung lautet die Ausgabe:
2.1.0-dev
Folgendes funktioniert von der Shell aus:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version
"2.1.0-dev"
Container auflisten
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()
dekodiert den HTTP-Body in ein Array von Objekten/Wörterbüchern, das Programm gibt dann jede Container-ID aus. Zum Beispiel:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id
"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"
Wenn der Abfrageparameter all=true nicht bereitgestellt worden wäre, dann wären nur die laufenden Container aufgelistet worden. Die Ressourcenabfragen und Parameter für die API sind hier dokumentiert.
Etwas Nützliches
Wir haben uns ein paar Beispiele angesehen, aber wie wäre es mit etwas Nützlicherem? Sie haben die Entwicklung des nächsten großartigen Containers abgeschlossen, und das folgende Skript entfernt alles aus Ihrem lokalen Speicher. (Wenn Sie die Eingabe von clean_storage.py sparen möchten)
#!/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")
[ Erste Schritte mit Containern? Schauen Sie sich diesen kostenlosen Kurs an. Containerisierte Anwendungen bereitstellen:Eine technische Übersicht. ]
Zusammenfassung
Ich hoffe, Sie finden das hilfreich. Die API-Dokumentation stellt Ihnen alle Ressourcen und erforderlichen Methoden zur Verfügung. Die Eingabe- und Ausgabekörper sind ebenso enthalten wie die Statuscodes.
Der Podman-Code befindet sich in intensiver Entwicklung und wir freuen uns über Ihren Beitrag zu Problemen und Pull-Anforderungen auf der GitHub-Seite des Projekts.