[TUT] Watchtower - Automatische Updates für Docker Container

  • Alles Screenshots in diesem Tutorial stammen aus meiner eigenen Testumgebung. Der gesamte Text wurde eigenständig verfasst. Codepassagen stammen z.T. von der offiziellen Webseite containrrr.dev/watchtower/usage-overview/.
    Yes

    Liebe Forengemeinde,
    in diesem Tutorial stelle ich Euch eine Anleitung zur Verfügung, mit welcher Ihr Watchtower innerhalb weniger Minuten installieren könnt. Voraussetzung für dieses Tutorial ist Portainer.

    Anleitung:

    1. Die Datei "watchtower.yml" herunterladen und in einem Texteditor Eurer Wahl öffnen
    2. Alle fett markierten Werte auf Basis Eures Mailservers anpassen, um Benachrichtigungen zu erhalten
      • WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=geheim
      • WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mustermann
      • WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=25
      • WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.example.com
      • WATCHTOWER_NOTIFICATION_EMAIL_TO=me@example.com
      • WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
    3. Portainer öffnen
    4. Im linken Menü "Stacks" anklicken
    5. Auf der rechten Seite "+ Add Stack" anklicken
    6. Bei "Name" "watchtower" (oder den Namen Eurer Wahl) eintragen
    7. Den Inhalt in der Datei "watchtower.yml" kopieren (Strg + A und danach Strg + C)
    8. Den Inhalt im Webeditor einfügen (Strg + V)
    9. Unter "Actions" auf "Deploy the Stack" klicken

    Anschließend könnt Ihr bei Euren Containern das gewünschte Label wie folgt hinzufügen:

    1. Im linken Menü auf "Containers" klicken
    2. Container per Checkbox auswählen und auf "Stop" klicken

    image

    1. Auf den Container und dann auf "Duplicate/Edit" klicken

    image

    image

    1. Runterscrollen und auf "Labels" klicken

    image

    1. Ganz nach unten scrollen und auf "Add item" klicken

    image

    1. Eintrag vornehmen
      • Für automatisches Updates des Docker-Containers wie folgt vorgehen:
        • Im Feld "name" folgendes eintragen: com.centurylinklabs.watchtower.enable
        • Im Feld "value" folgendes eintragen: true

    image

    Hinweis: Um lediglich über Updates per Mail informiert zu werden, folgende Werte eintragen:

    • Im Feld "name" folgendes eintragen: com.centurylinklabs.watchtower.monitor-only
    • Im Feld "value" folgendes eintragen: true
    1. Etwas nach oben scrollen und auf "Deploy the Container" klicken

    image

    Fertig, ab sofort wird Watchtower diesen Container täglich um 02:30 Uhr auf verfügbare Updates prüfen und diesen je nach deinen Angaben (Schritt 6) entweder updaten und dich darüber informieren, oder dich nur darüber informieren, falls ein Update verfügbar ist. Watchtower durchforstet alle Container, bei denen ein entsprechendes Label (Schritt 6) hinterlegt wurde.

    Hinweis:
    Eine Ausnahme stellt Portainer dar, Portainer KANN NICHT über Watchtower überwacht oder aktualisiert werden!

    Weiterführende Informationen findet Ihr auf der Entwicklerseite unter folgendem Link:

    Willi
    May 24, 2025 at 2:27 PM



    Viel Spaß beim installieren!

  • @"columbo1979"#14
    Mit der aktuell hinterlegten Einstellung in der Zeile

    Code
    - WATCHTOWER_SCHEDULE=0 30 02 * * *  

    musst du bis 02:30 Ihr warten, du kannst die Uhrzeit aber auch gerne nach deinen Bedürfnissen anpassen.

    Erklärung:
    0 = Sekunden 30 = Minuten, 02 = Stunde, die Sterne stehen für "an jedem Tag", "in jedem Monat", "in jeder Woche".

    image

    LG Willi

  • Definitiv schon mal nicht für Noobs wie mich geschrieben. Versteh ungefair: nichts.

    Hab Plex im Docker laufen, läuft einwandfrei. Plex meldet nun "update verfügbar".

    Habs runtergeladen und jetzt weiß ich nicht weiter. Und was hat das nun alles mit Portainer oder Watchtower zu tun? Wäre super wenn jemand mal erklärt wie (z.b. in meinem Plex Fall) ich das ganze nun mal aktualisieren kann?

    Ugreen DXP2800 | 32GB Crucial RAM | 2x 10 TB Ironwolf Pro
    Synology DS716+ | 8GB Samsung RAM | 2x 8TB Ironwolf Pro

  • @"kampfpopcorn"#45
    Das ist ein Tutorial für Watchtower und hat nichts mit der manuellen Aktualisiereung deines Plex zu tun.

    Fragen, die vom Thema abweichen, werden in diesem Thread nicht behandelt.
    Erstelle zu deiner Frage bitte eine neue Diskussion in der dafür passenden Kategorie.
    Danke!

  •   columbo1979 ,
    Wenn eine Aktualisierung durchgeführt wurde, erhältst du ein Email, wenn keine Email kommt, wurde auch nichts aktualisiert. Du kannst auch im Portainer-Log von “Watchtower“ nachschauen, was gemacht wurde.

    image

    image

    Voraussetzung ist natürlich auch, dass das korrekte Label bei allen zu prüfenden Containern hinterlegt ist und die Container mit „:latest“ installiert wurden.

    LG Willi

  • bis heute 11 Uhr ging alles gut... dann kam dies:

    2024-12-18T13:55:17.758512583Z INFO[0001] Note that the first check will be performed in 1 hour, 4 minutes, 42 seconds
    2024-12-18T15:00:17.986949529Z INFO[3901] Session done Failed=0 Scanned=6 Updated=0 notify=no
    2024-12-18T17:00:08.251603700Z INFO[11091] Session done Failed=0 Scanned=6 Updated=0 notify=no
    2024-12-18T19:00:23.190946847Z INFO[18306] Session done Failed=0 Scanned=7 Updated=0 notify=no
    2024-12-18T21:00:16.922777203Z INFO[25500] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-18T23:00:10.833662159Z INFO[32694] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T01:00:21.397239311Z INFO[39904] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T03:00:17.404144164Z INFO[47100] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T05:00:28.265800822Z INFO[54311] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T07:00:13.114917727Z INFO[61496] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T09:00:23.917976525Z INFO[68707] Session done Failed=0 Scanned=8 Updated=0 notify=no
    2024-12-19T11:01:25.144490704Z INFO[75968] Unable to update container "/changedetection": Error response from daemon: Get "https://lscr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:01:35.153478250Z WARN[75978] Could not do a head request for "ghcr.io/gethomepage/homepage:latest", falling back to regular pull. container=/homepage image="ghcr.io/gethomepage/homepage:latest"
    2024-12-19T11:01:35.154205852Z WARN[75978] Reason: Get "https://ghcr.io/v2/": dial tcp: lookup ghcr.io on 127.0.0.11:53: read udp 127.0.0.1:60571->127.0.0.11:53: i/o timeout container=/homepage image="ghcr.io/gethomepage/homepage:latest"
    2024-12-19T11:02:50.202208790Z INFO[76053] Unable to update container "/homepage": Error response from daemon: Get "https://ghcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:03:00.210053116Z WARN[76063] Could not do a head request for "ziggyds/iventoy:latest", falling back to regular pull. container=/iventoy image="ziggyds/iventoy:latest"
    2024-12-19T11:03:00.210137021Z WARN[76063] Reason: Get "https://index.docker.io/v2/": dial tcp: lookup index.docker.io on 127.0.0.11:53: read udp 127.0.0.1:38216->127.0.0.11:53: i/o timeout container=/iventoy image="ziggyds/iventoy:latest"
    2024-12-19T11:03:35.224399249Z INFO[76098] Unable to update container "/iventoy": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:03:45.235341130Z WARN[76108] Could not do a head request for "louislam/uptime-kuma:1", falling back to regular pull. container=/uptime-kuma image="louislam/uptime-kuma:1"
    2024-12-19T11:03:45.235433744Z WARN[76108] Reason: Get "https://index.docker.io/v2/": dial tcp: lookup index.docker.io on 127.0.0.11:53: read udp 127.0.0.1:53255->127.0.0.11:53: i/o timeout container=/uptime-kuma image="louislam/uptime-kuma:1"
    2024-12-19T11:04:20.279523537Z INFO[76143] Unable to update container "/uptime-kuma": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:04:30.286181993Z WARN[76153] Could not do a head request for "portainer/portainer-ee:2.25.0", falling back to regular pull. container=/portainer image="portainer/portainer-ee:2.25.0"
    2024-12-19T11:04:30.286302533Z WARN[76153] Reason: Get "https://index.docker.io/v2/": dial tcp: lookup index.docker.io on 127.0.0.11:53: read udp 127.0.0.1:36205->127.0.0.11:53: i/o timeout container=/portainer image="portainer/portainer-ee:2.25.0"
    2024-12-19T11:05:05.329287863Z INFO[76188] Unable to update container "/portainer": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:05:15.337659303Z WARN[76198] Could not do a head request for "containrrr/watchtower:latest", falling back to regular pull. container=/WATCHTOWER image="containrrr/watchtower:latest"
    2024-12-19T11:05:15.337746375Z WARN[76198] Reason: Get "https://index.docker.io/v2/": dial tcp: lookup index.docker.io on 127.0.0.11:53: read udp 127.0.0.1:37842->127.0.0.11:53: i/o timeout container=/WATCHTOWER image="containrrr/watchtower:latest"
    2024-12-19T11:05:50.352011779Z INFO[76233] Unable to update container "/WATCHTOWER": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:06:00.357513493Z WARN[76243] Could not do a head request for "ghcr.io/linuxserver/plex:latest", falling back to regular pull. container=/PlexHW image="ghcr.io/linuxserver/plex:latest"
    2024-12-19T11:06:00.357599457Z WARN[76243] Reason: Get "https://ghcr.io/v2/": dial tcp: lookup ghcr.io on 127.0.0.11:53: read udp 127.0.0.1:39431->127.0.0.11:53: i/o timeout container=/PlexHW image="ghcr.io/linuxserver/plex:latest"
    2024-12-19T11:07:15.434177728Z INFO[76318] Unable to update container "/PlexHW": Error response from daemon: Get "https://ghcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:07:25.442275181Z WARN[76328] Could not do a head request for "amir20/dozzle:latest", falling back to regular pull. container=/dozzle image="amir20/dozzle:latest"
    2024-12-19T11:07:25.442356334Z WARN[76328] Reason: Get "https://index.docker.io/v2/": dial tcp: lookup index.docker.io on 127.0.0.11:53: read udp 127.0.0.1:53394->127.0.0.11:53: i/o timeout container=/dozzle image="amir20/dozzle:latest"
    2024-12-19T11:08:00.454375340Z INFO[76363] Unable to update container "/dozzle": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). Proceeding to next.
    2024-12-19T11:08:00.454544550Z INFO[76363] Session done Failed=0 Scanned=8 Updated=0 notify=no

    jemand eine idee?

  • Fehler "gefunden"... habe heute um 10 Uhr auf meiner Unify Cyperproof aktivert und dieser hat gleich per Firewall das ganze gesperrt....

    Allerdings funktioniert die Zeitzone nicht... im Log steht 15:07 wobei 16;07 ist....

  •   columbo1979

    Zeitzone und Uhrzeit ist auf deinem NAS korrekt eingestellt?

    • Systemsteuerung > Uhrzeit und Sprache

    Sollte so aussehen zum Beispiel...

    image

  • ... da stimmt alles... echt komisch... immer genau eine stunde...

    hier nochmal ein fehler:

    2024-12-19T19:00:03.435980768Z WARN[13981] Could not do a head request for "docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0", falling back to regular pull. container=/immich_postgres image="docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0"
    2024-12-19T19:00:03.436056906Z WARN[13981] Reason: Parsed container image ref has no tag: docker.io/tensorchord/pgvecto-rs@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 container=/immich_postgres image="docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0"
    2024-12-19T19:00:10.699741937Z WARN[13989] Could not do a head request for "docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8", falling back to regular pull. container=/immich_redis image="docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8"
    2024-12-19T19:00:10.699791725Z WARN[13989] Reason: Parsed container image ref has no tag: docker.io/library/redis@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8 container=/immich_redis image="docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8"
    2024-12-19T19:00:20.784212092Z INFO[13999] Session done Failed=0 Scanned=12 Updated=0 notify=no

  •   columbo1979
    Und diese Zeile hast du auch nicht versehentlich unter "environment" herausgelöscht?

      • TZ=Europe/Brussels
  • mein stack sieht so aus:

    version: "3.9"
    services:
    watchtower:
    image: containrrr/watchtower:latest
    container_name: WATCHTOWER
    hostname: watchtower
    mem_limit: 512m
    mem_reservation: 128m
    cpu_shares: 512
    security_opt:

    • no-new-privileges=true
      read_only: true
      volumes:
    • /var/run/docker.sock:/var/run/docker.sock:ro
      environment:
      TZ: Europe/Brussels
      WATCHTOWER_CLEANUP: true # Remove old images after updating
      WATCHTOWER_REMOVE_VOLUMES: false # Remove attached volumes after updating
      DOCKER_API_VERSION: 1.45 # SSH docker version 1.41 for Docker engine version 20.10 - 1.43 for Docker engine version 24 - 1.45 for Docker engine version 26.1
      WATCHTOWER_INCLUDE_RESTARTING: true # Restart containers after update
      WATCHTOWER_INCLUDE_STOPPED: false # Update stopped containers
      WATCHTOWER_SCHEDULE: "0 0 /2 " # Update & Scan containers every 2 hours
      WATCHTOWER_LABEL_ENABLE: false
      WATCHTOWER_ROLLING_RESTART: true
      WATCHTOWER_TIMEOUT: 30s
      WATCHTOWER_LOG_FORMAT: pretty
      restart: on-failure:5
  •   columbo1979

    Dann müsste die Zeit eigentlich korrekt angezeigt werden, wenn auch deine Einstellungen wie in meinem oberen Screenshot dargestellt, korrekt sind. Möglicherweise liefert dein Zeitserver falsche Werte, prüfe das einmal bzw. ändere den Eintrag testweise mal auf pool.ntp.org

    Nun zu den Fehlern in deinem Logfile...

    Alle Meldungen, die ich sehe, betreffen die Anwendung "IMMICH".
    Diese Anwendung solltest du NICHT von Watchtower updaten lassen, da sich IMMICH in einer starken Entwicklungsphase befindet, wo zwischen neuen Versionen oftmals auch manuelle Anpassungen durchgeführt werden müssen.
    IMMICH besteht aus insgesamt 4 Containern, welche z.T. von einander abhängig sind.

    image

    Mit Abhängigkeiten meine ich z.B., dass Immich-SERVER in einen Fehler läuft, wenn Immich-DB nicht gestartet wurde.
    Watchtower kann mit solchen, speziellen Konstellationen nicht umgehen, daher die ganzen Meldungen 😉.

  • @"columbo1979"#14
    Nachtrag: Der Zeitunterschied war auch auf Github Thema und angeblich ein einmaliges Problem:

    Mach einmal folgendes in Portainer:

    1. Watchtower-Container stoppen
    2. Watchtower-Container löschen
    3. Neuen Stack erstellen (genau nach obenstehender Anleitung, ohne Anpassungen)
    4. Stack deployen
    5. Log prüfen, ob die Zeit nun stimmt
  • Wurde da evtl. die Winter und Sommerzeit irgendwo nicht richtig gesetzt, bzw. aktiviert diese zu berücksichtigen?
    Ansonsten würde ich einfach bei den Containern die Zeitzone so setzten, dass es passt.

    Meine Hardware

    iDX6011 Pro in Späh ^^

    DXP4800+ 2x8TB WDRedPl Btrfs Raid1 2x 2TB Lexar NM790 Raid1, 64GB RAM Kingst. KVR48S40BD8-32 DDR5/4800MH

    DXP2800 1x 12TB Seag. 1x 12TB WDRedPl, Raid1 Btrfs 16GB RAM Cruc. CT16G56C46S5.C8B2, 2x NVME Samsg,

    DS1525+ 2x8TB WD, Btrfs SHR, 2x 2TB NVME Lexar NM790 Raid1. 40GB ECC RAM_Speicher.de

    DS920+ DSM 7.3.2 Btrfs Raid1 2x8TB WD, 2x2TB Samsg. 970 EVOPlus, RAM 20GB DDR4-2666MHZ Speicher.de

    USV US3000, EatonEllip.PRO 850DIN, Switch Zyxel GS1200-8 1GB, Zyxel XMG-108 8 x 2,5GB

  • Quote

      columbo1979 es scheint so, als ob allen docker eine stunde fehlt

    Wenn allen Dockern eine Stunde fehlt, dann muss die Ursache an der Zeitkonfiguration in UGOS liegen.

    Wird Datum und Uhrzeit hier richtig oder falsch angezeigt?

    • Systemsteuerung > Uhrzeit & Sprache

    image

Participate now!

Join our community with over 10,000 members!

Register yourself now for free to get full access to all content, graphics, downloads and other exclusive features!