GNU/Linux >> Tutoriels Linux >  >> Linux

Explorer l'API RESTful de Podman à l'aide de Python et Bash

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


Linux
  1. Utilisation de Bash pour l'automatisation

  2. Utilisation de fichiers et d'appareils dans des conteneurs sans racine Podman

  3. rechercher et copier un fichier à l'aide de Bash

  4. Tableau dans Bash introuvable

  5. OpenCV et python/virtualenv ?

Obtenez podman opérationnel sur Windows en utilisant Linux

Surveiller les appels d'API et l'activité des utilisateurs dans AWS à l'aide de CloudTrail

Bash pause et continuer

Commande de sortie Bash et codes de sortie

Comment automatiser l'installation et le déploiement de Podman à l'aide d'Ansible

Création de classes et d'objets à l'aide de scripts bash