GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erkundung der Podman RESTful API mit Python und Bash

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 einen libpod 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.


Linux
  1. So erstellen Sie Bash-Skripte mit externen Variablen und eingebetteten Skripten

  2. Verwenden von Case-Anweisungen in Bash

  3. So verfolgen Sie Python-Skripte mit trace.py

  4. Array in Bash nicht gefunden

  5. Curl in einem Bash-Skript verwenden und curl erhalten:(3) Illegale Zeichen in URL gefunden

Bringen Sie podman unter Windows mit Linux zum Laufen

Überwachen Sie API-Aufrufe und Benutzeraktivitäten in AWS mit CloudTrail

Bash brechen und fortfahren

Bash Exit-Befehl und Exit-Codes

So automatisieren Sie die Podman-Installation und -Bereitstellung mit Ansible

Erstellen von Klassen und Objekten mit Bash-Scripting