341 - Como actualizar imágenes Docker automáticamente

PodcastPodcast

341 - Como actualizar imágenes Docker automáticamente

Un par de opciones para monitorizar y actualizar imágenes Docker automáticamente, con la configuración mínima viable para trabajar con ellos

1:25
-3:15

A pesar de que casi cuarenta contenedores Docker lenvantados detrás de Traefik, lo cierto es que no soy de tenerlos actualizados. Si, soy consciente de que esto es un error de primero de contenedores, pero en general prefiero hacerlo así. Llámame maniático, llámame raro, o como tu quieras. Prefiero revisar que imágenes tengo que actualizar y llegado el momento actualizarlas, pero a mano. Esto de actualizar imágenes Docker, sin supervisión nunca lo he terminado de ver.

Sin embargo, lo cierto es que esto es una verdadera locura. Es una verdadera locura porque alguno de estos contenedores, puede tener algún tipo de bug o agujero de seguridad y convertirse en la puerta de entrada. Y evidentemente no se trata de esto.

De esta forma, y después de mucho darle muchas vueltas, he decidido ponerle remedio, y ver la mejor manera de actualizar las imágenes Docker.

Como actualizar imágenes Docker

Como actualizar imágenes Docker

Como te decía el objetivo es actualizar las imágenes Docker y los contenedores de forma controlada y sin enfrentarme a un desastre. En este sentido, lo he afrontado desde dos puntos de vista completamente diferentes.

Por un lado, una simple monitorización. Es decir, se trata de que en el caso de que encuentre una actualización de una imagen me avise. Y por el otro, un paso mas, que además de avisarme, se encargue de actualizar los imágenes y posteriormente los contenedores.

Solo monitorización

En particular, a mi, me gusta mas esta opción. Me gusta mas esta opción, es decir, que solo me avise en el caso de encontrar una imagen desactualizada, para que posteriormente, yo me encargue de actualizarla, porque entiendo que me evitará mas de un problema.

Como te he comentado en mas de una ocasión, tengo varias docenas de contenedores en marcha detrás de Traefik. ¿Que pasaría con una actualización de Traefik automatizada que fallara? Me quedaría completamente a ciegas. Y esto, sin lugar a dudas es un verdadero problema, al menos para mi.

Sin embargo, si lo único que se produce es un aviso, simplemente me tengo que preocupar de actualizarla cuanto antes. Aquí habría que ver como tener una lista de tareas para evitar que esta lista se convirtiera en la lista interminable.

Diun

Para este caso de solo monitorización, una solución puede ser Diun.

Diun, Docker Image Update Notifier, es una aplicación, Open Source, para el terminal, implementada en Go y liberada bajo licencia MIT, que te permite recibir notificaciones cuando una imagen se actualiza en un Docker Registry. Es un sencillo ejecutable, con lo que realmente no necesitarías montarlo en un contenedor.

Respecto a las características de la aplicación,

  • Permite monitorizar un repositorio Docker y informar en el caso de nuevas etiquetas
  • Puedes filtrar etiquetas, con inclusión y exclusión mediante expresiones regulares
  • Tiene un cron para realizar las monitorizaciones
  • Permite lanzar varios hilos
  • Existen diferentes proveedores.
  • Para la notificación puedes utilizar diferentes servicios, como Gotify, al cual le dediqué no solo un episodio del podcast, sino que también le dediqué una aplicación. Pero además de Gotify, tienes otros servicios como Slack, Telegram, y mas.
  • Soporta healthcheck para monitorizar Diun.
  • Por supuesto tiene logging y una imagen disponible para que sea fácil de instalar, como he mencionado anteriormente.
Instalación de Diun

Respecto a la instalación de Diun, yo la hice con Docker Compose y el archivo docker-compose.yml es el siguiente,

version: '3'

services:
  diun:
    image: crazymax/diun:latest
    container_name: diun
    restart: unless-stopped
    volumes:
      - ./data:/data
      - ./diun.yml:/diun.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      TZ: Europe/Madrid
      LOG_LEVEL: info
      LOG_JSON: "false"

Respecto al archivo de configuración de Diun, tal y como lo tengo ahora es así diun.yml,

watch:
  workers: 20
  schedule: "0 */6 * * *"
  firstCheckNotif: true

providers:
  docker:
    watchByDefault: true
    watchStopped: true

notif:
  telegram:
    token: 999999999:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    chatIDs:
      - -1111111111111
    templateBody: |
      Docker tag {{ .Entry.Image }} which you subscribed to through {{ .Entry.Provider }} provider has been released.
  gotify:
    endpoint: https://gotify.tuservidor.es
    token: AAAAAAAAAAAAAAA
    priority: 1
    timeout: 10s
    templateTitle: "{{ .Entry.Image }} released"
    templateBody: |
      Docker tag {{ .Entry.Image }} which you subscribed to through {{ .Entry.Provider }} provider has been released.

Como ves, te permite definir varios proveedores, así como varios servicios de notificación.

Monitorización y actualización

La segunda de las alternativas por la que puedes decantarte a la hora de gestionar las actualizaciones de las imágenes de tus contenedores es por realizar no solo una monitorización, si no que en el caso de que se produzca una actualización de una de las imágenes se actualice.

En este sentido, existen diferentes servicios. En concreto tienes Ouroboros y WatchTower. Del primero de los dos no te hablaré porque no se encuentra mantenido por sus desarrolladores, así que me centraré en el segundo.

WatchTower

Se trata de una herramienta Open Source, liberada bajo licence Apache-2.0, y cuyo objetivo es poder monitorizar aquellos contenedores que tengas funcionando, y que tu lo quieras hacer, y en el caso de que se actualice la imagen, y así lo tenga definido, proceda a su actualización.

Básicamente, lo que hará será detener el contenedor y crear un nuevo contenedor con la misma configuración que tengas establecida.

A mi en particular, después de revisar con detenimiento este servicio me convence mas que solo la monitorización. Y es que WatchTower te permite hacer los dos trabajos, definiendo mediante etiquetas que es lo que quieres hacer en cada uno de los servicios que tengas corriendo.

Y es que, WatchTower tiene una configuración mas que interesante para hacer prácticamente cualquier cosa que puedas imaginar. Es sencillamente espectacular. Es mas, es posible combinarlo con Grafana para poder monitorizar en tiempo real el comportamiento de los escaneos y actualizaciones. Como de costumbre la información es poder.

Así, mi configuración actual es la siguiente, docker-compose.yml,

version: '3'

services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      WATCHTOWER_LABEL_ENABLE: "true"
      WATCHTOWER_NOTIFICATIONS: gotify
      WATCHTOWER_NOTIFICATION_GOTIFY_URL: https://gotify.tuservidor.es
      WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN: AAAAAAAAAAAAAAA
      WATCHTOWER_POLL_INTERVAL: 86400

La primera de las opciones WATCHTOWER_LABEL_ENABLE, indica que solo aqueloos contenedores que tiene la etiqueta com.centurylinklabs.watchtower.enable="true" serán monitorizadas.

Las tres siguientes etiquetas se refieren a las opciones para la notificación, mientras que la última etiqueta se refiere al intervalo entre revisiones en segundos, en este caso 1 día.

En cada uno de los contenedores tienes que añadir las siguientes etiquetas,

  • com.centurylinklabs.watchtower.enable="true" en el caso de que quieras que se monitorice y actualice.
  • com.centurylinklabs.watchtower.monitor-only="true" si solo quieres que se monitorice. Ahora mismo, lo tengo así en los contenedores, y estoy quitando la opción de monitor-only, exclusivamente en los que no afectan a mi producción.

Estas no son mas que unas pocas de todas las opciones que ofrece WatchTower. Además de esto tienes,

  • posibilidad de borrar las imágenes obsoletas
  • tienes la opción de indicar la versión de Docker
  • reiniciar los contenedores
  • realizar una programación tipo cron, similar a la que viste en Diun.

Conclusión

Como te indicaba anteriormente, desde luego, me decanto por WatchTower porque me permite en un servicio realizar todas las operaciones, monitorización y actualización. Sin embargo, ahora mismo, los tengo ambos funcionando para ver que fiabilidad tiene cada uno de ellos. En las próximas semanas te contaré mis conclusiones.


Más información,

Imagen de portada de Waldemar Brandt

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *