Depuis maintenant quelques jours, c'est officiel : Podman est en version 2 ! Et avec cette version, arrive également la nouvelle version de l'API REST ! Fini donc l'utilisation de varlink présent dans la première version. Il va être maintenant possible d'appeler cette nouvelle interface avec des outils comme cURL ou Postman en autres.

Mais tout d'abord - et avant de démarrer le service nécessaire à son utilisation - il va falloir installer podman v2 !

Installation de Podman v2

J'ai déjà écrit quelques articles sur le sujet mais au besoin voici un petit récapitulatif.

Pour installer cette version sur Fedora par exemple, rien de plus simple :

sudo dnf -y install --enablerepo updates-testing podman
Install Podman v2 on Fedora

De mon côté, j'utilise la version 2.1 sur Ubuntu que je compile à l'aide du tutoriel suivant :

Compiler Podman v2 sur Ubuntu 20.04
Vous souhaitez essayer et compiler Podman 2.0 sur Ubuntu 20.04 ? Je vous montre comment le faire !
Compiler Podman v2 sur Ubuntu 20.04

Vérifiez juste que votre version de Podman est bien en version 2 :

[email protected]:~$ podman version
Version:      2.1.0-dev
API Version:  1
Go Version:   go1.13.8
Git Commit:   3d3359086ef0ed0833a8ac8e9d06d9934d835139
Built:        Tue Jul 14 14:11:14 2020
OS/Arch:      linux/amd64
Podman version

Démarrons maintenant le service nécessaire à l'utilisation de l'API !

REST API

Pour cela rien de plus simple, il suffit de lancer la commande suivante :

[email protected]:~$ podman system service -t 3600 &

Quelques explications tout de même sur cette commande.

Avec celle-ci le service va être actif, et donc accepter les demandes, pour les prochaines 3600 secondes. Par contre ce délai est actualisé après la réception de chaque requête !

Il est bien évidemment possible de lancer le processus et de le garder actif, sans délai de fin et jusqu'à ce que le processus soit tué :

[email protected]:~$ podman system service -t 0 &

Tout comme pour Docker, cette API sera accessible au travers d'une socket. Vous pouvez également rendre celle-ci accessible directement depuis le réseau :

[email protected]:~$ podman system service --timeout 0 tcp:127.0.0.1:8080

Dans cet exemple, elle sera accessible sur mon interface local et sur le port 8080.

Enfin très utile, il est possible d'ajouter des informations de debug :

--log-level=debug

Votre API est accessible mais comment effectuer une requête sur celle-ci ?

Quelques exemples

Nous allons dans un premier temps, utiliser la commande curl pour effectuer quelques requêtes et nous familiariser avec son utilisation.

Commençons par récupérer les informations équivalentes à la commande podman info :

[email protected]:~$ curl -s --unix-socket $XDG_RUNTIME_DIR/podman/podman.sock http:/libpod/info

Vous devriez avoir un retour qui est formaté en JSON. Pour rendre tout ceci plus lisible vous pouvez utiliser la commande jq :

[email protected]:~$ curl -s --unix-socket $XDG_RUNTIME_DIR/podman/podman.sock http:/libpod/info | jq

cURL va de lui même utiliser la socket passée en argument car je ne précise aucun domaine de connexion.

jq est un utilitaire à connaître ! Il vous permet de manipuler du JSON en ligne de commande :

  • https://www.mon-code.net/article/95/Manipuler-des-JSON-en-ligne-de-commande-grace-a-JQ-exemple-avec-cURL

Si vous avez lancé votre service directement en TCP, pas besoin de passer par la socket :

[email protected]:~$ curl http://localhost:8080/libpod/info

Vous pouvez également utiliser la commande podman-remote pour une utilisation au travers de l'API :

[email protected]:~$ MYSOCK=unix:$XDG_RUNTIME_DIR/podman/podman.sock
[email protected]:~$ podman-remote --url $MYSOCK create nginx

Dans tous les cas, vous trouverez plus d'informations sur les possibilités offertes par cette nouveauté dans la documentation :

  • https://docs.podman.io/en/latest/_static/api.html

Enfin vous trouverez des exemples supplémentaires dans l'article qui m'a notamment servi de référence à l'écriture de cet article :

  • https://www.redhat.com/sysadmin/podmans-new-rest-api

Utiliser une API en cURL c'est bien pour quelques essais mais comment allez plus loin ?

Bonus

Il existe déjà un package Python pour faciliter les appels, vous trouverez le nécessaire ici :

containers/podman-py
Python bindings for Podman’s v2 API. Contribute to containers/podman-py development by creating an account on GitHub.

Il devient alors très simple de réaliser un script pour réaliser le même retour que la commande podman info.

Par exemple :

import podman

from podman import ApiConnection, system, images

# Provide a URI path for the libpod service.  In libpod, the URI can be a unix
# domain socket(UDS) or TCP.  The TCP connection has not been implemented in this
# package yet.

uri = "unix:/run/user/1000/podman/podman.sock"

with ApiConnection(uri) as api:
  # results are written to the screen as python dictionaries
  print(system.get_info(api))

Vous avez maintenant quelques notions afin d'utiliser l'API de Podman dans sa version 2. À noter que cette interface reste en cours de développement et qu'il existe encore quelques bugs :

  • https://github.com/containers/podman/issues?q=is%3Aissue+is%3Aopen+label%3Akind%2Fbug+label%3AAPIv2

N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇