Zum Inhalt

Docker-Container mit Watchtower automatisch aktuell halten

Veröffentlicht am 26. September 2026 · Geschätzte Lesezeit: 6 Minuten

Watchtower ist ein schlanker Docker-Container, der deine laufenden Container auf neue Image-Versionen prüft und automatisch aktualisiert. Statt für jeden Stack manuell docker compose pull und docker compose up -d auszuführen, erledigt Watchtower das nach einem festgelegten Zeitplan selbstständig – mit denselben Einstellungen, Volumes und Netzwerken wie beim ursprünglichen Start.[1] Die Einrichtung dauert etwa 15 Minuten.

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose
  • Terminalzugriff und ein Benutzer mit sudo-Rechten
  • Ausgehender Internetzugriff zu den verwendeten Image-Registries (Docker Hub, GitHub Container Registry, …)
  • Ein aktuelles Backup aller wichtigen Anwendungsdaten und Compose-Dateien

1. Projektordner anlegen

Lege einen eigenen Ordner für Watchtower an:

sudo mkdir -p /opt/watchtower
sudo chown -R "$USER":"$USER" /opt/watchtower
cd /opt/watchtower

2. Compose-Datei erstellen

Erstelle /opt/watchtower/compose.yaml. Das Basis-Setup startet Watchtower mit einem täglichen Prüflauf um 04:00 Uhr und räumt alte Images automatisch auf:

services:
  watchtower:
    image: nickfedor/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Europe/Berlin
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_INCLUDE_STOPPED=false

Ersetze Europe/Berlin durch deine Zeitzone (Liste mit timedatectl list-timezones).

Fork statt archiviertem Original

Das ursprüngliche Image containrrr/watchtower wurde im Dezember 2025 archiviert und ist für neue Installationen nicht mehr geeignet. Der Fork nickfedor/watchtower (v1.19.0, Stand Juni 2026) ist ein voll kompatibler Drop-in-Ersatz mit denselben Konfigurationsmöglichkeiten.[2]

3. Watchtower starten

Prüfe die Konfiguration und starte den Container:

docker compose config --quiet
docker compose up -d

Kontrolliere anschließend, ob der Container läuft:

docker ps | grep watchtower

4. Nächsten Lauf im Log prüfen

Watchtower zeigt beim Start an, wann der erste Prüflauf geplant ist:

docker logs watchtower

Suche nach einer Zeile wie Scheduling first run: 2026-09-27 04:00:00. Ist stattdessen ein Poll-Intervall gesetzt, erscheint eine Meldung wie Scheduling first run: 2026-09-27 09:01:00 +0000 UTC – das ist der Zeitpunkt des nächsten standardmäßigen 24-Stunden-Prüflaufs.

5. Einmaligen Testlauf durchführen

Starte Watchtower einmalig im Vordergrund, um sofort zu sehen, ob aktualisierbare Images vorhanden sind. Der Container führt die Prüfung aus und beendet sich selbst:

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower:latest \
  --run-once --cleanup

Pro Container zeigt Watchtower an, ob ein neues Image gefunden wurde (Found new ...), kein Update nötig ist (No new images found for ...) oder der Container übersprungen wird (Skipping ...). Nach dem Testlauf kannst du die nicht mehr benötigten ausgeschiedenen Images mit docker image prune -f manuell entfernen oder Watchtower dauerhaft mit der Umgebungsvariable WATCHTOWER_CLEANUP=true betreiben, die alte Images automatisch nach jedem erfolgreichen Update löscht.[1]

6. Container gezielt auswählen oder ausschließen

Standardmäßig aktualisiert Watchtower alle laufenden Container. Das ist nicht immer gewünscht – Datenbanken wie PostgreSQL oder MariaDB sollten keine automatischen Major-Upgrades erhalten.

Ausschluss per Label (Opt-out): Füge an dem Dienst, den Watchtower nicht aktualisieren soll, dieses Label ein:

services:
  postgres:
    image: postgres:16
    labels:
      - "com.centurylinklabs.watchtower.enable=false"

Opt-in-Modus (Empfehlung): Aktiviere den Label-Modus, sodass Watchtower nur Container mit dem enable-Label aktualisiert:[3]

services:
  watchtower:
    image: nickfedor/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Europe/Berlin
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true

Ergänze anschließend bei jedem Dienst, der automatisch aktualisiert werden soll:

labels:
  - "com.centurylinklabs.watchtower.enable=true"

Container ohne dieses Label ignoriert Watchtower dann vollständig.

7. Benachrichtigungen einrichten

Watchtower kann über Shoutrrr Benachrichtigungen versenden, sobald ein Container aktualisiert wurde. Das ist besonders im Opt-in-Modus wichtig, damit du siehst, was automatisch passiert ist.[1]

Telegram (Beispiel):

services:
  watchtower:
    image: nickfedor/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Europe/Berlin
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_NOTIFICATION_URL=telegram://<bot-token>@telegram?channels=<chat-id>

Ersetze <bot-token> durch den Token deines Telegram-Bots und <chat-id> durch die numerische ID des Empfängerchats. Das Shoutrrr-Format der Fork-Dokumentation ist mit dem Original kompatibel.[4]

Weitere Dienste wie Discord, Gotify oder E-Mail sind nach demselben Muster möglich. Eine vollständige Liste aller unterstützten Dienste und ihrer URL-Formate findest du in der Shoutrrr-Dokumentation.[4]

8. Poll-Intervall oder Cron-Planung

Du hast zwei sich ausschließende Optionen für den Zeitplan:

Option Variable/Flag Beschreibung
Cron WATCHTOWER_SCHEDULE Sechsfelder-Cron (Sekunden Minuten Stunden Tag-Monat Monat Wochentag). Beispiel: 0 0 4 * * * = täglich um 04:00 Uhr
Intervall WATCHTOWER_POLL_INTERVAL Sekunden zwischen Prüfläufen. 86400 = 24 Stunden, 3600 = stündlich

Setze nie beide Varianten gleichzeitig – sonst ist das Verhalten undefiniert.

9. Watchtower selbst von Updates ausnehmen

Damit Watchtower nicht versucht, sich selbst zu aktualisieren, füge ihm das disable-Label hinzu:

services:
  watchtower:
    image: nickfedor/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "com.centurylinklabs.watchtower.enable=false"
    environment:
      - TZ=Europe/Berlin
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true

10. Backup und Rückweg

Watchtower selbst ist zustandslos – die Konfiguration steckt komplett in der Compose-Datei. Ein Backup ist daher schnell erstellt:

sudo tar -czf "/var/backups/watchtower-$(date +%F).tar.gz" -C /opt watchtower

Zum vollständigen Entfernen stoppst du Watchtower und löscht den Ordner:

cd /opt/watchtower && docker compose down
sudo rm -rf /opt/watchtower

Die von Watchtower aktualisierten Container laufen unverändert weiter.

Sollte ein automatisches Update einen Container beschädigen:

  1. Stoppe Watchtower: docker compose -f /opt/watchtower/compose.yaml down
  2. Setze das Image des betroffenen Containers auf eine bekannte funktionierende Version zurück (z. B. von :latest auf :16 bei PostgreSQL)
  3. Starte den Container manuell neu: docker compose up -d
  4. Prüfe Logs und Funktionsfähigkeit

Typische Fehler

  • Archiviertes Image verwendet: containrrr/watchtower statt nickfedor/watchtower. Der Fork ist der einzige aktuell gepflegte Zweig. Prüfe mit docker pull nickfedor/watchtower:latest, ob du die richtige Image-Quelle verwendest.
  • Schedule und Poll-Intervall gleichzeitig gesetzt: Nur eine der beiden Varianten nutzen, sonst unklares Verhalten.
  • Label-Modus aktiv, aber keine Labels gesetzt: WATCHTOWER_LABEL_ENABLE=true ohne com.centurylinklabs.watchtower.enable=true an einem Container führt dazu, dass Watchtower gar nichts aktualisiert. Das Log zeigt dann nur Skipping.
  • Permission denied auf dem Docker-Socket: Bei Rootless Docker liegt der Socket nicht unter /var/run/docker.sock. Prüfe mit docker context inspect den tatsächlichen Socket-Pfad und passe das Volume an.
  • Private Registry ohne Login: Images aus privaten Registries erfordern, dass die Anmeldedaten im Watchtower-Container verfügbar sind. Entweder ~/.docker/config.json mounten oder die Registry-Umgebungsvariablen setzen.

Sources

[1] https://watchtower.nickfedor.com/dev/quickstart/ – Watchtower Fork: Quickstart, Container-Selection und Benachrichtigungen [2] https://github.com/nicholas-fedor/watchtower/releases – Fork GitHub Releases: v1.19.0 (Juni 2026) und aktuellere Versionen [3] https://watchtower.nickfedor.com/v1.20.0/getting-started/container-selection/ – Container Selection: Opt-in per Label [4] https://containrrr.dev/shoutrrr/v0.8/services/telegram/ – Shoutrrr: Telegram-URL-Format für Benachrichtigungen [5] https://s-edv.com/anleitungen/watchtower-docker-automatische-updates – Ausführliche deutschsprachige Praxis-Anleitung (Juni 2026) [6] https://youtube.com/watch?v=GHeZaoUpVcQ – Better Stack: "Watchtower – The PERFECT Docker Automation Tool?" (04:22 Min.)

Fertig

Watchtower aktualisiert deine ausgewählten Docker-Container nun automatisch nach dem eingestellten Zeitplan. Die Funktionsprüfung ist bestanden, wenn der Container läuft, das Log den nächsten geplanten Lauf anzeigt und ein manueller Testlauf (--run-once) die erwarteten Container prüft, ohne unerwartet welche zu überspringen oder zu aktualisieren. Du erhältst bei erfolgreicher Benachrichtigungskonfiguration eine Meldung über durchgeführte Updates.