Watchtower
Watchtower — kontener, który monitoruje uruchomione kontenery Docker i automatycznie je aktualizuje gdy w rejestrze pojawi się nowy obraz. Co POLL_INTERVAL sekund porównuje digest lokalnego obrazu z digestem w rejestrze i jeśli się różnią:
- Pull nowego obrazu
- Graceful stop starego kontenera
- Start nowego z tymi samymi parametrami (volumes, env, ports, networks)
- Usunięcie starego obrazu (
WATCHTOWER_CLEANUP: true)
Używam forka nicholas-fedor/watchtower (ghcr.io/nicholas-fedor/watchtower:latest) — aktywnie utrzymywany fork oryginalnego containrrr/watchtower, który został zarchiwizowany w grudniu 2025 i nie jest już rozwijany.
Konfiguracja
services:
watchtower:
image: ghcr.io/nicholas-fedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config.json:/config.json:ro
environment:
WATCHTOWER_CLEANUP: true
WATCHTOWER_POLL_INTERVAL: 60
WATCHTOWER_LABEL_ENABLE: true
WATCHTOWER_DEBUG: false
WATCHTOWER_LABEL_ENABLE: true — aktualizuje tylko kontenery z labelem com.centurylinklabs.watchtower.enable: true. Bez niego kontener jest ignorowany.
Prywatne rejestry
Watchtower potrzebuje credentials, żeby pullować obrazy z prywatnych rejestrów. Plik config.json montowany jako /config.json:ro:
{
"auths": {
"ghcr.io": {
"auth": "<base64 z user:token>"
}
}
}
Format identyczny z ~/.docker/config.json po docker login ghcr.io. Wartość auth to base64 z username:github_personal_access_token (PAT z uprawnieniem read:packages).
Generowanie:
echo -n "username:ghp_TwojToken" | base64
Zmienne środowiskowe
| Zmienna | Opis |
|---|---|
WATCHTOWER_POLL_INTERVAL | Co ile sekund sprawdzać (domyślnie 86400 = 24h) |
WATCHTOWER_CLEANUP | Usuwa stare obrazy po aktualizacji |
WATCHTOWER_LABEL_ENABLE | Aktualizuje tylko kontenery z labelem watchtower |
WATCHTOWER_DEBUG | Verbose logi |
WATCHTOWER_SCHEDULE | Cron zamiast poll (np. 0 0 4 * * * = 4:00) |
WATCHTOWER_NOTIFICATION_URL | Powiadomienia — Slack, Discord, Gotify (format Shoutrrr) |
Dodawanie labela do kontenera
Żeby Watchtower aktualizował kontener, wystarczy dodać label w docker-compose.yml:
services:
moj-serwis:
image: ghcr.io/user/app:latest
labels:
com.centurylinklabs.watchtower.enable: true
Po docker compose up -d Watchtower zacznie monitorować ten kontener przy następnym poll cycle.