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
- Docker instalado
Repositorio
Docker Hub: containrrr/watchtower - Docker Image | Docker Hub
Portainer
Add a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero «docker-compose.yml» y el contenido del fichero de variables
Variables
TZ=Europe/Madrid
docker-compose
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
environment:
- TZ=Europe/Madrid
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
network_mode: host
command:
# Solo contenedores con label com.centurylinklabs.watchtower.enable=true
- --label-enable
# Limpia imágenes antiguas tras actualizar
- --cleanup
# Ejecuta cada noche a las 03:30 (hora del contenedor → usa TZ arriba)
- --schedule=0 30 3 * * *
# (Opcional) tiempo de gracia para que el servicio arranque tras actualizar
- --stop-timeout=30s
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.