Watchdog ermöglicht es euch die Images eures Docker Containers automatisiert auf dem aktuellen Stand zu halten. In dieser zeige ich euch, wie ihr Watchdog in wenigen Schritten mittels Docker installiert.

1. Voraussetzungen

  • Docker installiert

2. Wichtiger Hinweis vorweg

Watchtower macht automatische Updates! Wenn Watchtower eine Aktualisierung macht und das Latest-Image hat widererwartend einen Fehler könnte es passieren, dass nach der Aktualisierung der Container nicht mehr läuft oder es gar zum Datenverlust kommt!

3. Verzeichnis erstellen

Zu erst erstellen wir das passende Verzeichnis:

mkdir -p /opt/containers/watchtower

4. Docker Compose anlegen

Nun legen wir die eigentliche Docker Datei an. Diese dient dazu unseren späteren Container zu erstellen. In diese Datei kopiere ich mir mal das Beispiel aus der Dokumentation:

nano /opt/containers/watchtower/docker-compose.yml
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

5. Watchtower starten

Wir starten das angelegte Docker-Compose nun mal mit der beispielhaften Konfiguration:

docker compose -f /opt/containers/watchtower/docker-compose.yml up
docker-compose -f /opt/containers/watchtower/docker-compose.yml up

Ausgabe:

Damit läuft der Container und gibt uns folgende Informationen aus:

  • msg=“Watchtower 1.4.0″
    –> Version des laufenden Watchtower
  • msg=“Using no notifications“
    –> Das keine Benachrichtigungen konfiguriert sind
  • msg=“Checking all containers (except explicitly disabled with label)“
    –> Es werden alle Container geprüft außer die die eine expliziten Hinweis gesetzt haben
  • msg=“Scheduling first run: 2022-06-17 18:57:19 +0000 UTC“
    –> Geplante erste Durchführung
  • msg=“Note that the first check will be performed in 23 hours, 59 minutes, 59 seconds“
    –> Zeit bis zur ersten Durchführung

Damit würde es grundsätzlich schonmal funktionieren und hat akut auch noch kein Update eingespielt sondern nur geplant. Wie wir den ausgegebenen Informationen entnehmen können gibt es wohl noch eine Vielzahl an möglichen Konfigurationen.

6. Weitere Konfigurationen

Genau mit dieser Vielzahl an möglichen Konfigurationen wollen wir uns in diesem Teil beschäftigen.

6.1 Zeitzone definieren

Es fällt auf, dass die Zeitzone bzw. die Zeit im Container nicht stimmt. Dazu gibt es in den Argumenten auch einen Hinweis es via TZ zu definieren. Wir nutzen in diesem Fall einfach die Zeitzone vom Host:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro

Wenn wir diesen Container nun starten gibt er uns nun die Zeit + 24h aus. Diese Entspricht nun der Host-Zeit.

6.2 Benachrichtigungen

Es gibt einen Hinweis, dass wir Benachrichtigungen konfigurieren können und es erscheint Sinnvoll diese auch zu konfigurieren damit wir einen Bericht bekommnen über getätigte Updates bzw. Durchläufe. Dazu werfen wir einen kurzen Blick in die offizielle Dokumentation. Diese gibt uns folgende Möglichkeiten:

  • email -> Benachrichtigung via Email
  • slack -> Benachrichtigung via Slack
  • msteams -> Benachrichtigung via MSTeams
  • gotify -> Benachrichtigung via Gotify
  • shoutrrr -> Benachrichtigung via containrrr/shoutrrr

6.2.1 via Slack

Ich persönlich habe mich für die Variante via Slack entschieden. Da ich mehrere Server mit Watchtower betreibe und zugleich nicht unnötig zugespamt werden möchte z.B. via Email.

Für diese Variante benötigen wir innerhalb unseres Slack Workspaces einen vorhanden Channel oder legen einen neuen Channel an. Nun müssen wir diesem Channel die App „Eingehende Webhooks“ hinzufügen. Dies gibt uns eine Webhook-URL aus welche wir in die Konfiguration der docker-compose.yml einarbeiten:

„Ausgabekräftiges Label“ und „Name anpassen“ kann an dieser Stelle frei gewählt werden. Ich persönlich habe mir auch das Symbol mit dem Watchtower-Symbol angepasst.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info # Klassifizierung, die für die Benachrichtigungen verwendet wird. Mögliche Werte sind: panic, fatal, error, warn, info, debug oder trace.
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"  # Webhook-URL einfügen
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01  # Eigenen Identifier eingeben
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower  # Vorher angelegten oder zugeordneten Channel eingeben

Wenn wir nun den Container erneut starten gibt er uns aus, dass Slack nun zur Benachrichtigung definiert wurde. Innerhalb von Slack sollten wir in dem gewünschten Channel auch eine Benachrichtigung bekommen haben:

docker compose -f /opt/containers/watchtower/docker-compose.yml up
docker-compose -f /opt/containers/watchtower/docker-compose.yml up

Ausgabe:

6.2.2 via Email

In dieser Variante möchten wir eine Email als Benachrichtigungen einrichten.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info # Klassifizierung, die für die Benachrichtigungen verwendet wird. Mögliche Werte sind: panic, fatal, error, warn, info, debug oder trace.
      - WATCHTOWER_NOTIFICATIONS=email
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=absender@meine-domain.tld         # Angezeigter Absender der Email einfügen
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=zieladresse@meine-domain.tld        # Empfänger-Adresse der Email einfügen
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=meine-domain.tld                # SMTP-Server einfügen
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=absender@meine-domain.tld  # SMTP Benutzername einfügen
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=MAILPASSWORD           # SMTP-Passwort einfügen
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587                        # SMTP-Port einfügen

Wenn wir nun den Container erneut starten gibt er uns aus, dass SMTP nun zur Benachrichtigung definiert wurde und wir bekommen eine Email an die definierte Adresse:

docker compose -f /opt/containers/watchtower/docker-compose.yml up
docker-compose -f /opt/containers/watchtower/docker-compose.yml up

6.3 Container-Auswahl via Flag

6.3.1 Opt out

Standardisiert werden nun alle Container aktualisiert, die nicht explizit via Label von der Aktualisierung ausgeschlossen wurden. Dies kann uns zum Beispiel bei Mailcow Probleme bereiten. Mailcow hat ein eigenes Update-Script und sollte deswegen vom automatisierten Aktualisieren ausgeschlossen werden.

Mit diesem Label können wir einzelne Container von der Aktualisierung ausschließen:

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

Wenn wir nun Container von der Aktualisierung ausschließen möchten müssen wir dieses Label in jede Container-Definition der jeweiligen Docker-Compose-Datei hinzufügen. Als Beispiel schließen wir mal den Watchtower selbst von den aktualisierungen aus:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
    labels:
      - "com.centurylinklabs.watchtower.enable=false" # Hier wird der Service: Watchtower von den Aktualisierungen ausgeschlossen.

6.3.2 Opt in

Ich persönlich bevorzuge die Variante, dass kein Container aktualisiert wird. Nur die Container welche ich explizit definiere also sozusagen ein Opt-in.

Dazu erweiteren wir unsere docker-compose.yml um die Option WATCHTOWER_LABEL_ENABLE:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true                   # Hiermit aktivieren wir, dass nur explizit definierte Services aktualisiert wird.

Nun können wir jeden Container via docker-compose.yml mittels Label mitgeben, dass dieser explizit aktualisiert werden soll:

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

Wenn wir nun Container automatisiert aktualisieren lassen möchten, müssen wir dieses Label in jede Container-Definition der jeweiligen Docker-Compose-Datei hinzufügen. Als Beispiel möchten wir das Watchtower sich automatisiert auf dem neusten Stand hält:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true" # Hiermit wird dieser Service explizit automatisiert aktualisiert.

6.4 Zeitplan

Nun gilt es einen Zeitplan zu erstellen. Beim Zeitplan können wir mit der bekannten Cron expression in 6 Feldern eine Regelmäßigkeit in der docker-compose.yml Konfigurieren:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * * # Hier anpassen. Im Beispiel: Jede Nacht um 04:00 Uhr
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

In diesem Beispiel würden jede Nacht um 04:00 Uhr die Aktualisierungen durchgeführt.

6.5 Images säubern

Mit der Zeit wird das Docker-System ganz schön zuwuchern, weil mit jedem durchgeführten Aktualisierung wird ein neues Image geladen. Nun ist es sinnvoll, wenn wir die alten Images auch automatisiert löschen.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true # Mit dieser Option werden nach dem Start des neuen Images die alten entfernt
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

6.6 Timeout

Jetzt definieren wir noch ein größeres Timeout. Das Timeout ist standardgemäß auf 10s gesetzt – 10 Sekunden bevor der Container zwangsweise gestoppt wird. Wir setzten die Zeit auf 30 Sekunden:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s # Hier passen wir die Timeoutzeit an.
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

6.7 Neustarten

Definieren wir nun noch, dass der Container nach der aktualisierung neu gestartet wird:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true # Hiermit wird der Neustart konfiguriert.
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

6.8 Images nacheinander starten

Wenn wir die Images nicht gleichzeitig sonder nacheinander starten lassen wird unserer potenzielle Down-Time verlängert. Also lassen wir doch die Container nacheinander neustarten.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_ROLLING_RESTART=true # Restart nacheinander durchführen
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

6.9 Gestopte Container

Auch erstellte und verlassene Container können wir berücksichtigen.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_ROLLING_RESTART=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_ROLLING_RESTART=true
      - WATCHTOWER_INCLUDE_STOPPED=true # Erstellte und verlassene Container mit einbeziehen
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

6.10 weiter Möglichkeiten

Es gibt noch viele Möglichkeiten, die wie hier konfigurieren könnten. Ich kann euch an dieser Stelle nur nochmals die Dokumentation ans Herz legen.

7. Komplette Docker-Compose

Long Story Short:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      - WATCHTOWER_NOTIFICATIONS_LEVEL=info
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX"
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-server-01
      - WATCHTOWER_NOTIFICATION_SLACK_CHANNEL=#watchtower
      - WATCHTOWER_NO_STARTUP_MESSAGE=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 9 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_ROLLING_RESTART=true
      - WATCHTOWER_INCLUDE_STOPPED=true
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
docker compose -f /opt/containers/watchtower/docker-compose.yml up
docker-compose -f /opt/containers/watchtower/docker-compose.yml up

8. Quellen: