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ą:

  1. Pull nowego obrazu
  2. Graceful stop starego kontenera
  3. Start nowego z tymi samymi parametrami (volumes, env, ports, networks)
  4. 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

Kluczowe zmienne Watchtower
ZmiennaOpis
WATCHTOWER_POLL_INTERVALCo ile sekund sprawdzać (domyślnie 86400 = 24h)
WATCHTOWER_CLEANUPUsuwa stare obrazy po aktualizacji
WATCHTOWER_LABEL_ENABLEAktualizuje tylko kontenery z labelem watchtower
WATCHTOWER_DEBUGVerbose logi
WATCHTOWER_SCHEDULECron zamiast poll (np. 0 0 4 * * * = 4:00)
WATCHTOWER_NOTIFICATION_URLPowiadomienia — 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.