Actualización automática de contenedores podman con systemd

Los contenedores de actualización automática pueden ser muy útiles en algunos casos. Podman proporciona mecanismos para encargarse de las actualizaciones de contenedores automáticamente. Este artículo demuestra cómo usar las actualizaciones automáticas de Podman para sus configuraciones.

Podman

Podman es un reemplazo de Docker sin demonios que puede manejar contenedores rootfull y rootless. Es plenamente consciente de SELinux y Firewalld. Además, viene preinstalado con Fedora Linux para que pueda comenzar a usarlo de inmediato.

Si Podman no está instalado en su máquina, use uno de los siguientes comandos para instalarlo. Seleccione el comando apropiado para su entorno.

# Fedora Workstation / Server / Spins
$ sudo dnf install -y podman

# Fedora Silverblue, IoT, CoreOS
$ rpm-ostree install podman

Podman también está disponible para muchas otras distribuciones de Linux como CentOS, Debian o Ubuntu. Por favor, eche un vistazo a la Instrucciones de instalación de Podman.

Contenedores de actualización automática

Actualizar el sistema operativo de forma regular es algo obligatorio para obtener las funciones más nuevas, las correcciones de errores y las actualizaciones de seguridad. Pero, ¿y los contenedores? Estos no son parte del Sistema Operativo.

¿Por qué actualizar automáticamente?

Si desea actualizar su sistema operativo, puede ser tan fácil como:

$ sudo dnf update

Esto no se hará cargo de los contenedores desplegados. Pero, ¿por qué debería cuidar de estos? Si revisa el contenido de los contenedores, encontrará la aplicación (por example MariaDB en el contenedor docker.io/library/mariadb) y algunas dependencias, incluidas las utilidades básicas.

Ejecutar actualizaciones para contenedores puede ser tedioso y llevar mucho tiempo, ya que debe:

  1. saca la nueva imagen
  2. detener y retirar el contenedor en funcionamiento
  3. iniciar el contenedor con la nueva imagen

Este procedimiento debe realizarse para cada contenedor. Actualizar 10 contenedores fácilmente puede terminar tomando 30-40 comandos que deben ejecutarse.

La automatización de estos pasos ahorrará tiempo y garantizará que todo esté actualizado.

podman y systemd

Podman tiene soporte incorporado para systemd. Esto significa que puede iniciar/detener/reiniciar contenedores a través de systemd sin necesidad de un demonio separado. La función de actualización automática de Podman requiere que los contenedores se ejecuten a través de systemd. Esta es la única forma de asegurarse automáticamente de que todos los contenedores deseados funcionen correctamente. Algunos artículos como estos para Bitwarden y Matrix Server ya analizaron esta función. Para este artículo, usaré un método aún más simple Apache httpd envase.

Primero, inicie el contenedor con la configuración deseada.

# Run httpd container with some custom settings
$ sudo podman container run -d -t -p 80:80 --name web -v web-volume:/usr/local/apache2/htdocs/:Z docker.io/library/httpd:2.4

# Just a quick check of the container
$ sudo podman container ls
CONTAINER ID  IMAGE                        COMMAND           CREATED        STATUS            PORTS               NAMES
58e5b07febdf  docker.io/library/httpd:2.4  httpd-foreground  4 seconds ago  Up 5 seconds ago  0.0.0.0:80->80/tcp  web

# Also check the named volume
$ sudo podman volume ls
DRIVER      VOLUME NAME
local       web-volume

Ahora, configure systemd para manejar la implementación. Podman generará el archivo necesario.

# Generate systemd service file
$ sudo podman generate systemd --new --name --files web

/home/USER/container-web.service

Esto generará el archivo container-web.service en su directorio actual. Revisa y edita el archivo a tu gusto. Aquí está el contenido del archivo con líneas nuevas agregadas y formato para mejorar la legibilidad.

# container-web.service

[Unit]
Description=Podman container-web.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/container-web.pid %t/container-web.ctr-id

ExecStart=/usr/bin/podman container run 
          --conmon-pidfile %t/container-web.pid 
          --cidfile %t/container-web.ctr-id 
          --cgroups=no-conmon 
          --replace 
          -d 
          -t 
          -p 80:80 
          --name web 
          -v web-volume:/usr/local/apache2/htdocs/ 
          docker.io/library/httpd:2.4

ExecStop=/usr/bin/podman container stop 
          --ignore 
          --cidfile %t/container-web.ctr-id 
          -t 10

ExecStopPost=/usr/bin/podman container rm 
          --ignore 
          -f 
          --cidfile %t/container-web.ctr-id

PIDFile=%t/container-web.pid
Type=forking

[Install]
WantedBy=multi-user.target default.target

Ahora, elimine el contenedor actual, copie el archivo en el directorio systemd adecuado e inicie/habilite el servicio.

# Remove the temporary container
$ sudo podman container rm -f web

# Copy the service file
$ sudo cp container-web.service /etc/systemd/system/container-web.service

# Reload systemd
$ sudo systemctl daemon-reload

# Enable and start the service
$ sudo systemctl enable --now container-web

# Another quick check
$ sudo podman container ls
$ sudo systemctl status container-web

Tenga en cuenta que el contenedor ahora solo se puede administrar a través de systemd. Iniciar y detener el contenedor con el comando “podman” puede interferir con systemd.

Ahora que la configuración general está fuera del camino, eche un vistazo a la actualización automática de este contenedor.

Actualizaciones automáticas manuales

Lo primero que hay que mirar son las actualizaciones automáticas manuales. ¿Suena raro? Esta función le permite evitar los 3 pasos por contenedor, pero tendrá control total sobre la fecha y la hora de actualización. Esto es muy útil si solo desea actualizar los contenedores en una ventana de mantenimiento o durante el fin de semana.

Edite el archivo /etc/systemd/system/container-web.service y agréguele la etiqueta que se muestra a continuación.

--label "io.containers.autoupdate=registry"

El archivo modificado tendrá una sección que aparecerá así:

...snip...

ExecStart=/usr/bin/podman container run 
          --conmon-pidfile %t/container-web.pid 
          --cidfile %t/container-web.ctr-id 
          --cgroups=no-conmon 
          --replace 
          -d 
          -t 
          -p 80:80 
          --name web 
          -v web-volume:/usr/local/apache2/htdocs/ 
          --label "io.containers.autoupdate=registry" 
          docker.io/library/httpd:2.4

...snip...

Ahora vuelva a cargar systemd y reinicie el servicio del contenedor para aplicar los cambios.

# Reload systemd
$ sudo systemctl daemon-reload

# Restart container-web service
$ sudo systemctl restart container-web

Después de esta configuración, puede ejecutar un comando simple para actualizar una instancia en ejecución a la última imagen disponible para la etiqueta utilizada. En esto example caso, si hay una nueva imagen 2.4 disponible en el registro, Podman descargará la imagen y reiniciará el contenedor automáticamente con un solo comando.

# Update containers
$ sudo podman auto-update

Actualizaciones automáticas programadas

Podman también proporciona una unidad de temporizador systemd que permite actualizaciones de contenedores en un horario. Esto puede ser muy útil si no desea manejar las actualizaciones por su cuenta. Si está ejecutando un pequeño servidor doméstico, esto podría ser lo adecuado para usted, por lo que recibe las últimas actualizaciones cada semana más o menos.

Habilite el temporizador systemd para podman de la siguiente manera:

# Enable podman auto update timer unit
$ sudo systemctl enable --now podman-auto-update.timer 

Created symlink /etc/systemd/system/timers.target.wants/podman-auto-update.timer → /usr/lib/systemd/system/podman-auto-update.timer.

Opcionalmente, puede editar el horario del temporizador. De manera predeterminada, la actualización se ejecutará todos los lunes por la mañana, lo cual está bien para mí. Edite el módulo del temporizador usando este comando:

$ sudo systemctl edit podman-auto-update.timer

Esto abrirá su editor predeterminado. Cambiar el horario está más allá del alcance de este artículo, pero el enlace a systemd.timer a continuación lo ayudará. La sección Demo de Systemd Timers for Scheduling Tasks también contiene detalles.

Eso es todo. Nada más que hacer. Podman ahora se encargará de las actualizaciones de imágenes y también eliminará las imágenes antiguas según un cronograma.

Insinúa consejos

La actualización automática parece ser la solución perfecta para las actualizaciones de contenedores, pero debe considerar algunas cosas antes de hacerlo.

  • evite usar la etiqueta “más reciente”, ya que puede incluir actualizaciones importantes
  • considere usar etiquetas como “2” o “2.4”, si el proveedor de imágenes las tiene
  • pruebe las actualizaciones automáticas de antemano (¿el contenedor admite actualizaciones sin pasos adicionales?)
  • considere tener copias de seguridad de sus volúmenes de Podman, en caso de que algo salga mal
  • las actualizaciones automáticas pueden no ser muy útiles para configuraciones altamente productivas, donde necesita un control total sobre la versión de la imagen en uso
  • actualizar un contenedor también reinicia el contenedor y elimina la imagen anterior
  • comprobar ocasionalmente si se están aplicando las actualizaciones

Si tiene en cuenta los consejos anteriores, debería estar listo para comenzar.

Documentos y enlaces

Si desea obtener más información sobre este tema, consulte los enlaces a continuación. Hay mucha información útil en la documentación oficial y en algunos blogs.

Conclusión

Como puede ver, sin el uso de herramientas adicionales, puede ejecutar fácilmente actualizaciones automáticas en contenedores Podman de forma manual o programada. La programación permite actualizaciones desatendidas durante la noche, y obtendrá las últimas actualizaciones de seguridad, funciones y correcciones de errores. Algunas configuraciones que he probado con éxito son: MariaDB, Ghost Blog, WordPress, Gitea, Redis y PostgreSQL.

Related Posts