Cómo actualizar automáticamente los contenedores de Podman

Es una buena práctica actualizar el software, especialmente cuando obtiene nuevas funciones y/o seguridad adicional en las nuevas actualizaciones.

En este artículo, le mostraré cómo habilitar las actualizaciones automáticas para los contenedores administrados por Podman.

Para propósitos de demostración, usaré el caddy imagen de Centro acoplable .

Determinar la fuente para obtener la imagen

Para usar una imagen de contenedor, Podman necesita extraer esa imagen de algún lugar. Este “en algún lugar” se conoce como la política de actualización automática.

Las políticas de actualización automática son las siguientes:

  • registry : cuando la política de actualización automática se establece en la cadena registry Podman extraerá la imagen de un registro remoto como Centro acoplable y muelle.io .
  • local : cuando la política de actualización automática se establece en la cadena local , Podman obtendrá la imagen de las imágenes creadas localmente. Esta política de actualización es útil cuando es un desarrollador y desea probar los cambios locales antes de enviarlos a un registro remoto.

✍🏻 Estoy ejecutando un contenedor sin raíz . He intentado especificar comandos si usas un contenedor raíz lleno donde puedo, pero yo siendo un ser humano, eso puede haber pasado por alto.

Simplemente use el sudo cuando encuentre un error relacionado con los privilegios ( solo si tiene un contenedor root-full ).

Habilitación de actualizaciones automáticas

Ahora que sabe qué es una “política de actualización automática”, podemos continuar con este tutorial.

Todo lo que necesita hacer para habilitar las actualizaciones automáticas para un contenedor administrado por Podman es agregar la siguiente etiqueta:

                      
                        io.containers.autoupdate=AUTO_UPDATE_POLICY
                      
                    

Sustituir la cadena AUTO_UPDATE_POLICY con cualquiera registry o con local ¡y estás listo para irte!

“Pero, ¿cómo se actualizará automáticamente el contenedor cuando Podman no tiene un demonio?”

integración systemd

Cuando dije que “Solo necesitas agregar el io.containers.autoupdate etiqueta a su contenedor,” verá… Mentí mal.

El contenedor que debe actualizarse automáticamente debe ser administrado por systemd. “¿Por qué me empujas systemd por la garganta?” Bueno, porque Podman tiene una arquitectura sin demonios. Y el contenedor debe administrarse de alguna manera.

Si desea que su contenedor se inicie automáticamente al arrancar, ya está usando systemd para hacerlo.

En el artículo vinculado a continuación, analizo cómo puede integrar un contenedor Podman, ya sea un contenedor con raíz completa o un contenedor sin raíz, con systemd (con la intención de que también se inicie automáticamente en el arranque).

De todos modos, le daré una descripción general rápida de cómo administrar contenedores de Podman usando systemd.

Paso 0: crea un contenedor

Asegúrese de tener un contenedor existente. No importa si el contenedor está funcionando o detenido.

Puede verificar qué contenedores tiene ejecutando el siguiente comando:

                      
                        podman container list
                      
                    

Para este tutorial, saqué una imagen anterior de Caddy Server (versión 2.5.2-alpine ) y le hemos cambiado el nombre a alpine . Cambiar el nombre de esta imagen ayudará a demostrar el proceso de actualización. Puede verificarlo usted mismo porque la identificación de la imagen de la etiqueta 2.5.2-alpine y alpine son idénticos 😉

Usando esta imagen, creé un contenedor que se llama prathams-caddy .

A continuación se muestra cómo se ve en mi computadora:

                      
                        $ podman images
REPOSITORY               TAG           IMAGE ID      CREATED      SIZE
docker.io/library/caddy  2.5.2-alpine  d83af79bf9e2  2 weeks ago  45.5 MB
docker.io/library/caddy  alpine        d83af79bf9e2  2 weeks ago  45.5 MB

$ podman container list
CONTAINER ID  IMAGE                   COMMAND               CREATED        STATUS            PORTS       NAMES
99d1838dd999  localhost/caddy:alpine  caddy run --confi...  5 seconds ago  Up 6 seconds ago              prathams-caddy
                      
                    

Como puede ver, tengo un contenedor llamado prathams-caddy y esta corriendo el caddy image (que está en una versión anterior).

El contenedor prathams-caddy fue creado con la etiqueta io.containers.autoupdate ajustado a registry . Si tiene un contenedor existente sin esta etiqueta, no se preocupe; no necesita volver a crear su contenedor. Esto se cubrirá en el siguiente paso.

Paso 1: Genere un archivo de servicio systemd para su contenedor

Bueno, para administrar su contenedor Podman a través de systemd, debe convertirse en un servicio. Hablando de manera realista, desea que su contenedor se inicie en el arranque y desee detenerlo cuando apague el sistema. Tiene sentido ejecutar su contenedor como un servicio systemd.

“¿Pero no es demasiado trabajo escribir un archivo de servicio systemd para cada contenedor que tengo?” Está. Y los desarrolladores de Podman han pensado en esto. El único trabajo manual que debe hacer es ejecutar un comando para cada uno de sus contenedores.

Si tienes un contenedor raíz lleno (un contenedor con privilegios de root), ejecute el siguiente comando:

                      
                        sudo podman generate systemd -f --new --name CONTAINER_NAME
                      
                    

Si su contenedor es un contenedor sin raíz (un contenedor sin privilegios de root), ejecute el siguiente comando:

                      
                        podman generate systemd -f --new --name CONTAINER_NAME
                      
                    

Sustituir la cadena CONTAINER_NAME con el nombre de su contenedor y un archivo con el nombre container-CONTAINER_NAME.service se creará.

Para mi contenedor Caddy Server, haré lo siguiente:

                      
                        $ podman generate systemd -f --new --name prathams-caddy
/home/pratham/container-prathams-caddy.service
                      
                    

Como es evidente a partir de la salida, el archivo container-prathams-caddy.service fue creado. Se creará en el directorio de trabajo actual.

Pero esto es para contenedores que ya tienen un valor establecido para la etiqueta. io.containers.autoupdate . ¿Qué pasa con los contenedores que ya existen sin esta etiqueta? No tiene que volver a crear sus contenedores con esta etiqueta.

En ese caso, edite el archivo de servicio systemd y agregue la siguiente línea al ExecStart campo así:

                      
                        [...]
ExecStart=/usr/bin/podman run 
    [...]
    --label io.containers.autoupdate=registry
[...]
                      
                    

Esencialmente, su archivo de servicio systemd solo está invocando el podman run dominio. Todo lo que está haciendo es agregar la etiqueta io.containers.autoupdate hacia podman run dominio. ¿Pulcro?

Paso 2: Mueva el archivo de servicio systemd

Ahora que ya se creó un servicio systemd para nosotros, debemos habilitarlo. Pero antes de habilitarlo, el archivo de servicio debe moverse a uno de los siguientes directorios:

  • /etc/systemd/system/ : si el contenedor está lleno de raíz y debe iniciarse con privilegios de superusuario.
  • ~/.config/systemd/user/ : Si el contenedor no tiene raíz, colóquelo en el directorio correspondiente del usuario que pretende iniciarlo.

El contenedor prathams-caddy es un contenedor sin raíz, por lo que lo moveré en consecuencia.

                      
                        $ mv -v container-prathams-caddy.service ~/.config/systemd/user/
renamed 'container-prathams-caddy.service' -> '/home/pratham/.config/systemd/user/container-prathams-caddy.service'
                      
                    

Paso 3: habilite el servicio systemd

Ahora que el archivo de servicio está ubicado en un directorio apropiado, podemos proceder a habilitarlo. Pero primero, systemd debe estar al tanto de nuestro servicio recién creado, sin reiniciar nuestra computadora.

Si el servicio necesita privilegios de superusuario, vuelva a cargar systemd con el siguiente comando:

                      
                        sudo systemctl daemon-reload
                      
                    

Si el servicio está iniciando un contenedor sin raíz, ejecute el siguiente comando:

                      
                        systemctl --user daemon-reload
                      
                    

Una vez hecho esto, simplemente podemos usar el systemctl enable comando para habilitar nuestro servicio. Utilice cualquiera de los comandos en función de sus requisitos:

                      
                        # for a root-full container
sudo systemctl enable SERVICE_NAME.service

# for a root-less container
systemctl --user enable SERVICE_NAME.service
                      
                    

Una vez habilitado, puede verificar el estado de su servicio. No te alarmes si dice inactive (dead) . Esto se debe a que nuestro servicio se inicia en el inicio y no hemos iniciado la computadora después de habilitar el servicio.

                      
                        $ systemctl --user enable container-prathams-caddy.service
Created symlink /home/pratham/.config/systemd/user/default.target.wants/container-prathams-caddy.service → /home/pratham/.config/systemd/user/container-prathams-caddy.service.

$ systemctl --user status container-prathams-caddy.service
○ container-prathams-caddy.service - Podman container-prathams-caddy.service
     Loaded: loaded (/home/pratham/.config/systemd/user/container-prathams-caddy.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:podman-generate-systemd(1)
                      
                    

Ahora es el mejor momento para detener el contenedor (si se está ejecutando) y podman container rm y reiniciar.

                      
                        $ podman stop prathams-caddy
prathams-caddy

$ podman container rm prathams-caddy
99d1838dd9990b2f79b4f2c83bc9bc16dfbaf3fdeeb6c6418ddd6e641535ce21
                      
                    

Paso 4 (opcional): habilitar la permanencia del usuario

Si creó un servicio systemd para un contenedor sin raíz, es mejor habilitar la permanencia del usuario para su usuario en particular.

Esto se puede lograr ejecutando el siguiente comando:

                      
                        sudo loginctl enable-linger
                      
                    

Entonces, ¿mi contenedor se actualizará automáticamente ahora?

“Agregué el io.containers.autoupdate etiqueta a mi(s) contenedor(es). También administro mis contenedores con systemd ahora. ¿Mi contenedor actualizará automáticamente la imagen ahora?”

Bueno, no… Pero solo queda un paso… eso debería contar para algo, ¿no? ¿Derecha? Correcto…?

Todo lo que hay que hacer ahora es habilitar el podman-auto-update Servicio. Hazlo con el siguiente comando:

                      
                        sudo systemctl enable podman-auto-update.service
                      
                    

Con el podman-auto-update servicio habilitado, systemd verificará si alguna imagen necesita ser actualizada. Si hay actualizaciones, las imágenes se recuperan primero. Luego se reinicia el contenedor. La imagen anterior se conserva en caso de que sea necesario revertir la actualización por n razones.

¿Actualizaciones automáticas? No gracias.

Si las actualizaciones automáticas no son lo tuyo, también te complacerá saber que puedes actualizar manualmente los contenedores con un solo comando, siempre que sean administrados por systemd.

Ese comando es el podman auto-update dominio. Y si solo desea buscar actualizaciones, pase el --dry-run opción para que ningún contenedor se actualice de forma aguda.

Veamos si puedo actualizar mi caddy imagen de ‘2.5.2-alpine’ a ‘2.6.1-alpine’ usando el podman auto-update dominio.

                      
                        $ podman container list
CONTAINER ID  IMAGE                   COMMAND               CREATED        STATUS            PORTS       NAMES
a712a3c8846b  docker.io/library/caddy:alpine  caddy run --confi...  2 seconds ago  Up 2 seconds ago              prathams-caddy

$ podman auto-update --dry-run
UNIT                              CONTAINER                      IMAGE         POLICY      UPDATED
container-prathams-caddy.service  a712a3c8846b (prathams-caddy)  caddy:alpine  registry    pending
                      
                    

Como puedes ver en el UPDATED columna de la salida de podman auto-update comando, dice pending . Esto indica que hay una actualización disponible.

Para actualizar el contenedor, elimine el --dry-run opción.

Conclusión

El proceso de habilitar actualizaciones automáticas para sus contenedores Podman puede parecer un poco complicado, pero créame, esto valdrá la pena a largo plazo. Todos los contenedores administrados se actualizarán automáticamente a la medianoche (si hay actualizaciones). Y, si el contenedor enfrenta algún problema, systemd lo revertirá a una imagen más antigua para que su contenedor siga funcionando.

Si encuentras esto útil, por favor comenta abajo y cuéntanos tu opinión. <3


Related Posts