Vous avez peut-être entendu dire que Podman V2 a une nouvelle API RESTful. Ce document illustre l'API à l'aide d'exemples de code dans Python et de commandes shell. Des notes supplémentaires sont incluses dans les commentaires du code. Le code fourni a été écrit pour être clair par rapport à la qualité de la production.
Exigences
- Vous avez installé Python > 3.4.
- Vous avez installé la bibliothèque de requêtes Python.
- notes d'installation
- Un IDE pour l'édition de Python est recommandé.
- Deux fenêtres de terminal :une pour exécuter le service Podman et consulter les informations de débogage, la seconde pour exécuter des scripts.
- L'utilisation des commandes curl et jq est démontrée.
- Vous pouvez consulter les URL de connexion ici.
Démarrer
Le service
Pour ces exemples, nous exécutons le service Podman en tant qu'utilisateur normal et sur un numéro de port TCP/IP non sécurisé.
Pour la production, le service Podman doit utiliser le protocole d'activation de socket de systemd. Cela permet à Podman de prendre en charge les clients sans démons supplémentaires et de sécuriser le point de terminaison d'accès.
La commande suivante exécute le service Podman sur le port 8080 sans délai. Vous devrez taper ^C dans cette fenêtre de terminal lorsque vous avez terminé le didacticiel.
# podman system service tcp:localhost:8080 --log-level=debug --time=0
En plus du socket TCP démontré ci-dessus, le service Podman prend en charge l'exécution sous le protocole d'activation de socket de systemd et les sockets de domaine Unix (UDS).
[ Vous pourriez également aimer : Aperçu :la nouvelle API REST de Podman ]
Code Python
Ressource d'informations
Ce qui suit nous montre des informations sur le service Podman et l'hébergeur :
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/info")
Plongée en profondeur
requests.get()
appelle les demandes bibliothèque pour transmettre l'URL au service Podman à l'aide de la méthode GET HTTP.- Les demandes fournit des méthodes d'assistance pour toutes les méthodes HTTP populaires.
http://localhost:8080
correspond à l'invocation du service Podman ci-dessus./v1.40.0
indique la version de l'API que nous utilisons./libpod
indique que nous nous attendons à ce que le service fournisse unlibpod
- charge utile de retour spécifique.- Si cet élément n'est pas utilisé, le serveur renvoie une charge utile compatible.
/info
spécifie la ressource que nous interrogeons.
Intéressant à lire, mais sans sortie, comment savons-nous que cela a fonctionné ?
Obtenir la sortie
Ajoutez les lignes ci-dessous et vous pouvez maintenant voir la version de Podman en cours d'exécution sur l'hôte :
response.raise_for_status()
info = json.loads(response.text)
print(info.version.Version)
raise_for_status()
déclenche une exception si le code d'état n'est pas compris entre 200 et 399.json.loads()
décode le corps de la réponse HTTP dans un objet/dictionnaire.
Une fois exécuté, le résultat est :
2.1.0-dev
Ce qui suit fonctionne depuis le shell :
$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version
"2.1.0-dev"
Répertorier les conteneurs
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()
décode le corps HTTP en un tableau d'objets/dictionnaires, le programme imprime ensuite chaque identifiant de conteneur. Par exemple :
$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id
"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"
Si le paramètre de requête all=true n'avait pas été fourni, seuls les conteneurs en cours d'exécution auraient été répertoriés. Les requêtes de ressources et les paramètres de l'API sont documentés ici.
Quelque chose d'utile
Nous avons examiné quelques exemples, mais que diriez-vous de quelque chose d'un peu plus utile ? Vous avez terminé de développer le prochain grand conteneur, et le script ci-dessous supprimera tout de votre stockage local. (Si vous voulez économiser en tapant 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")
[ Vous débutez avec les conteneurs ? Découvrez ce cours gratuit. Déploiement d'applications conteneurisées :présentation technique. ]
Résumé
J'espère que ça t'as aidé. La documentation de l'API vous fournit toutes les ressources et les méthodes requises. Les corps d'entrée et de sortie sont inclus ainsi que les codes d'état.
Le code Podman est en cours de développement intensif et nous apprécions vos commentaires sur les problèmes et les demandes d'extraction sur la page GitHub du projet.