GNU/Linux >> Linux Esercitazione >  >> Linux

Esplorazione dell'API RESTful di Podman utilizzando Python e Bash

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


Linux
  1. Utilizzo di file e dispositivi in ​​contenitori Podman rootless

  2. Come creare script Bash utilizzando variabili esterne e script incorporati

  3. Utilizzo delle istruzioni Case in Bash

  4. OpenCV e python/virtualenv?

  5. Usando curl in uno script bash e ottenendo curl:(3) Caratteri illegali trovati nell'URL

Ottieni podman attivo e funzionante su Windows usando Linux

Monitora la chiamata API e l'attività dell'utente in AWS utilizzando CloudTrail

Bash pausa e continua

Comando di uscita Bash e codici di uscita

Come automatizzare l'installazione e la distribuzione di Podman utilizzando Ansible

Creazione di classi e oggetti utilizzando lo scripting bash