Es posible que haya escuchado que Podman V2 tiene una nueva API RESTful. Este documento demuestra la API usando ejemplos de código en Python y comandos de shell. Se incluyen notas adicionales en los comentarios del código. El código provisto fue escrito para ser claro frente a la calidad de producción.
Requisitos
- Tiene Python>3.4 instalado.
- Ha instalado la biblioteca de solicitudes de Python.
- notas de instalación
- Se recomienda un IDE para editar Python.
- Dos ventanas de terminal:una para ejecutar el servicio Podman y revisar la información de depuración, la segunda ventana para ejecutar scripts.
- Se demuestra el uso de los comandos curl y jq.
- Puede revisar las URL de conexión aquí.
Cómo empezar
El servicio
Para estos ejemplos, estamos ejecutando el servicio Podman como un usuario normal y en un número de puerto TCP/IP no seguro.
Para la producción, el servicio Podman debe usar el protocolo de activación de socket de systemd. Esto permite que Podman admita clientes sin demonios adicionales y asegure el punto final de acceso.
El siguiente comando ejecuta el servicio Podman en el puerto 8080 sin tiempo de espera. Deberá escribir ^C en esta ventana de terminal cuando haya terminado con el tutorial.
# podman system service tcp:localhost:8080 --log-level=debug --time=0
Además del socket TCP demostrado anteriormente, el servicio Podman admite la ejecución bajo el protocolo de activación de socket de systemd y sockets de dominio Unix (UDS).
[ También te puede interesar: Adelanto:nueva API REST de Podman]
Código Python
Recurso de información
A continuación nos muestra información sobre el servicio y host de Podman:
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/info")
Inmersión profunda
requests.get()
llama a las solicitudes biblioteca para pasar la URL al servicio Podman usando el método GET HTTP.- Las solicitudes biblioteca proporciona métodos auxiliares para todos los métodos HTTP populares.
http://localhost:8080
coincide con la invocación del servicio Podman anterior./v1.40.0
denota la versión de API que estamos usando./libpod
denota que esperamos que el servicio proporcione unlibpod
-carga útil de retorno específica.- Si no se usa este elemento, el servidor devolverá una carga útil compatible.
/info
especifica el recurso que estamos consultando.
Interesante de leer, pero sin salida, ¿cómo sabemos que funcionó?
Obteniendo salida
Agregue las líneas a continuación y ahora podrá ver la versión de Podman que se ejecuta en el host:
response.raise_for_status()
info = json.loads(response.text)
print(info.version.Version)
raise_for_status()
genera una excepción si el código de estado no está entre 200 y 399.json.loads()
decodifica el cuerpo de la respuesta HTTP en un objeto/diccionario.
Cuando se ejecuta, la salida es:
2.1.0-dev
Lo siguiente funciona desde el shell:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version
"2.1.0-dev"
Listado de contenedores
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 el cuerpo HTTP en una matriz de objetos/diccionarios, el programa luego imprime cada Id. de contenedor. Por ejemplo:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id
"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"
Si el parámetro de consulta all=true no se hubiera proporcionado, entonces solo se habrían enumerado los contenedores en ejecución. Las consultas de recursos y los parámetros para la API se documentan aquí.
Algo útil
Hemos visto un par de ejemplos, pero ¿qué tal algo un poco más útil? Ha terminado de desarrollar el próximo gran contenedor y el siguiente script eliminará todo de su almacenamiento local. (Si desea ahorrar escribiendo 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")
[ ¿Empezando con los contenedores? Consulta este curso gratuito. Implementación de aplicaciones en contenedores:una descripción técnica general. ]
Resumen
Espero que encuentres esto útil. La documentación de la API le proporciona todos los recursos y métodos necesarios. Se incluyen los cuerpos de entrada y salida, así como los códigos de estado.
El código de Podman se encuentra en pleno desarrollo y agradecemos sus aportes con problemas y solicitudes de incorporación de cambios en la página de GitHub del proyecto.