Potresti aver sentito che Podman V2 ha una nuova API RESTful. Questo documento illustra l'API utilizzando esempi di codice in Python e comandi della shell. Note aggiuntive sono incluse nei commenti al codice. Il codice fornito è stato scritto per essere chiaro rispetto alla qualità di produzione.
Requisiti
- Hai installato Python>3.4.
- Hai installato la libreria delle richieste Python.
- Note di installazione
- Si consiglia un IDE per la modifica di Python.
- Due finestre di terminale:una per eseguire il servizio Podman e rivedere le informazioni di debug, la seconda finestra per eseguire gli script.
- Viene dimostrato l'utilizzo dei comandi curl e jq.
- Puoi rivedere gli URL di connessione qui.
Per iniziare
Il servizio
Per questi esempi, stiamo eseguendo il servizio Podman come un utente normale e su un numero di porta TCP/IP non protetto.
Per la produzione, il servizio Podman dovrebbe utilizzare il protocollo di attivazione del socket di systemd. Ciò consente a Podman di supportare i client senza ulteriori demoni e di proteggere l'endpoint di accesso.
Il comando seguente esegue il servizio Podman sulla porta 8080 senza timeout. Dovrai digitare ^C in questa finestra del terminale quando hai finito con il tutorial.
# podman system service tcp:localhost:8080 --log-level=debug --time=0
Oltre al socket TCP mostrato sopra, il servizio Podman supporta l'esecuzione con il protocollo di attivazione del socket di systemd e i socket di dominio Unix (UDS).
[ Potrebbe piacerti anche: Anteprima:la nuova API REST di Podman ]
Codice Python
Risorsa informativa
Quanto segue ci mostra informazioni sul servizio Podman e sull'host:
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/info")
Immersione profonda
requests.get()
chiama le richieste libreria per passare l'URL al servizio Podman utilizzando il metodo GET HTTP.- Le richieste libreria fornisce metodi di supporto per tutti i metodi HTTP più diffusi.
http://localhost:8080
corrisponde alla chiamata al servizio Podman sopra./v1.40.0
indica la versione dell'API che stiamo utilizzando./libpod
denota che ci aspettiamo che il servizio fornisca unlibpod
- carico utile di ritorno specifico.- Il mancato utilizzo di questo elemento fa sì che il server restituisca un carico utile compatibile.
/info
specifica la risorsa che stiamo interrogando.
Interessante da leggere, ma senza output, come facciamo a sapere che ha funzionato?
Ottenere output
Aggiungi le righe seguenti e ora puoi vedere la versione di Podman in esecuzione sull'host:
response.raise_for_status()
info = json.loads(response.text)
print(info.version.Version)
raise_for_status()
solleva un'eccezione se il codice di stato non è compreso tra 200 e 399.json.loads()
decodifica il corpo della risposta HTTP in un oggetto/dizionario.
Quando viene eseguito, l'output è:
2.1.0-dev
Il seguente funziona dalla shell:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version
"2.1.0-dev"
Elencare i contenitori
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()
decodifica il corpo HTTP in una matrice di oggetti/dizionari, il programma quindi stampa ogni ID contenitore. Ad esempio:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id
"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"
Se il parametro della query all=true non fosse stato fornito, sarebbero stati elencati solo i contenitori in esecuzione. Le query sulle risorse e i parametri per l'API sono documentati qui.
Qualcosa di utile
Abbiamo esaminato un paio di esempi, ma che ne dici di qualcosa di un po' più utile? Hai finito di sviluppare il prossimo grande contenitore e lo script seguente rimuoverà tutto dalla tua memoria locale. (Se vuoi risparmiare digitando 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")
[ Iniziare con i container? Dai un'occhiata a questo corso gratuito. Distribuzione di applicazioni containerizzate:una panoramica tecnica. ]
Riepilogo
Spero che tu lo trovi utile. La documentazione dell'API fornisce tutte le risorse e i metodi richiesti. I corpi di input e output sono inclusi così come i codici di stato.
Il codice Podman è in fase di forte sviluppo e accogliamo con favore il tuo contributo con problemi e richieste pull sulla pagina GitHub del progetto.