Watchtower

Watchtower es un contenedor que se ejecuta en segundo plano y se encarga de vigilar tus contenedores Docker y actualizarlos automáticamente cuando detecta que hay una nueva imagen disponible en el registry (Docker Hub, GitHub Container Registry, etc.).
En otras palabras: es un “autoupdater” para Docker.
Funcionamiento
Watchtower actúa sobre todo el host (todos los stacks) compartiendo el daemon Docker. Para que actualice contenedores añade la label com.centurylinklabs.watchtower.enable=true en esos servicios dentro de sus propios docker-compose.yml.
labels:
- com.centurylinklabs.watchtower.enable=true
-
Watchtower comprueba periódicamente las imágenes de los contenedores que tengas corriendo.
-
Si encuentra una versión más reciente, la descarga.
-
Para cada contenedor afectado:
-
Lo detiene,
-
Lo recrea usando la nueva imagen,
-
Lo arranca de nuevo con las mismas opciones (puertos, volúmenes, variables de entorno, etc.) que tenía antes.
-
Enlaces
Requisitos
Watchtower monitoriza imágenes y actualiza contenedores automáticamente cuando hay nuevas versiones.
Características
DockerActualizainstaladosolo contenedores etiquetados (flag--label-enable)- Limpieza de imágenes antiguas (flag
--cleanup) - Programación vía cron con flag
--schedule - Tiempo de gracia en parada (
--stop-timeout) - Notificaciones (Shoutrrr: Telegram, Slack, Email, etc.)
Repositorio
Despliegue
git clone https://git.ictiberia.com/groales/watchtower
cd watchtower
docker compose up -d
Etiquetado de servicios
DockerPara Hub:que containrrr/watchtowerun servicio se auto-actualice, añade la label:
labels:
- Docker"com.centurylinklabs.watchtower.enable=true"
Image
Para Dockerexcluir Hubexplícitamente:
labels:
Portainer
- "com.centurylinklabs.watchtower.enable=false"
Configuración (flags usados)
AddEl a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero «docker-compose. yml»yamlyutiliza elflags contenidoen del ficherolugar de variables de entorno para mayor claridad:
Variables
TZ=Europe/Madriddocker-compose
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
environment:command:
- TZ=Europe/Madrid
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
network_mode: host
command:-label-enable # Solo contenedores con label com.centurylinklabs.watchtower.enable=true
- --label-enable
# Limpia imágenes antiguas tras actualizar
- --cleanup # EjecutaElimina cadaimágenes nocheantiguas atras las 03:30 (hora del contenedor → usa TZ arriba)actualizar
- --schedule=0 30 3 * * * # Ejecuta cada día a las 03:30 (Opcional)TZ tiempo de gracia para que el servicio arranque tras actualizarconfigurado)
- --stop-timeout=30s # Tiempo de gracia al parar contenedores
Buenas prácticas
- Etiqueta solo servicios que quieras actualizar
- Usa horarios de baja actividad (madrugada)
- Revisa logs tras cambios de versiones críticas
- Mantén backups si actualizas servicios con datos persistentes
- Excluye servicios que gestionas manualmente (
enable=false)
Configuración de compatibilidad
Watchtower requiere especificar la versión de API de Docker para compatibilidad:
environment:
- TZ=Europe/Madrid
- DOCKER_API_VERSION=1.44
Esto asegura que Watchtower funcione correctamente con versiones modernas de Docker Engine.
Troubleshooting
docker logs watchtower --tail=200
Forzar actualización
1. Contenedor temporal (one-shot)
Lanzar un contenedor Watchtower independiente, con los mismos parámetros, pero añadiendo --run-once:
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once --label-enable --cleanup
2. Lanzar un escaneo manual en el contenedor existente
docker exec -it watchtower /watchtower --run-once --cleanup
Así usas el mismo contenedor que ya tienes corriendo.