Nervt es dich, regelmäßig prüfen zu müssen, ob es eventuell ein neues Image für deinen Docker-Container gibt? Glaub mir, das kenne ich auch und hier kommt die Abhilfe.
Watchtower ist selbst eine Docker-Instanz, welche alle deine Images, die ein :latest am Ende des Image-Namen haben, automatisch auf Stand hält. Aber das ist nur die halbe Wahrheit, denn Watchtower hat noch so viele weitere Optionen, du kannst die Konfiguration sehr granular gestalten (bis hin nur einzelne Container upzudaten oder dich nur benachrichtigen zu lassen und und und).
Aber fangen wir doch mal ganz einfach an und starten Watchtower mit einem ersten kleinen Durchlauf:
# docker run --rm \
--name WatchTower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once \
--cleanup \
--include-restarting \
--rolling-restart \
--include-stopped
Unable to find image 'containrrr/watchtower:latest' locally
latest: Pulling from containrrr/watchtower
1045b2f97fda: Pull complete
35a104a262d3: Pull complete
1a0671483169: Pull complete
Digest: sha256:bbf9794a691b59ed2ed3089fec53844f14ada249ee5e372ff0e595b73f4e9ab3
Status: Downloaded newer image for containrrr/watchtower:latest
time="2022-02-11T13:49:33Z" level=info msg="Watchtower 1.4.0"
time="2022-02-11T13:49:33Z" level=info msg="Using no notifications"
time="2022-02-11T13:49:33Z" level=info msg="Checking all containers (except explicitly disabled with label)"
time="2022-02-11T13:49:33Z" level=info msg="Running a one time update."
time="2022-02-11T13:50:22Z" level=info msg="Found new portainer/portainer-ce:latest image (ed396c816a75)"
time="2022-02-11T13:54:27Z" level=info msg="Found new jamesits/ripe-atlas:latest image (71384fb7c5d4)"
time="2022-02-11T13:55:13Z" level=info msg="Found new adguard/adguardhome:latest image (debe970b1d29)"
time="2022-02-11T13:58:38Z" level=info msg="Found new mysql:latest image (d1dc36cf8d9e)"
time="2022-02-11T13:58:38Z" level=info msg="Stopping /MySQL (70ee5f6d852e) with SIGTERM"
time="2022-02-11T13:59:01Z" level=info msg="Creating /MySQL"
time="2022-02-11T13:59:04Z" level=info msg="Creating /adguardhome"
time="2022-02-11T13:59:08Z" level=info msg="Stopping /ripe-atlas (0b4ad2ff9d23) with SIGTERM"
time="2022-02-11T13:59:26Z" level=info msg="Creating /ripe-atlas"
time="2022-02-11T13:59:39Z" level=info msg="Stopping /portainer (96b218f7653d) with SIGTERM"
time="2022-02-11T13:59:43Z" level=info msg="Creating /portainer"
time="2022-02-11T13:59:47Z" level=info msg="Removing image cbe8815cbea8"
time="2022-02-11T13:59:49Z" level=info msg="Removing image 657fe69ec5ab"
time="2022-02-11T13:59:49Z" level=info msg="Removing image b3975ff9ab9c"
time="2022-02-11T13:59:50Z" level=info msg="Removing image 0df02179156a"
time="2022-02-11T13:59:52Z" level=info msg="Session done" Failed=0 Scanned=26 Updated=4 notify=no
time="2022-02-11T13:59:52Z" level=info msg="Waiting for the notification goroutine to finish" notify=no
Gehen wir das ganze doch mal durch. Mit o.a. Kommando startest du Watchtower. Die einzelnen Optionen bedeuten dabei folgendes:
–run-once führt Wacthtower nur ein einziges Mal aus, keine keine zukünftige automatische Aktualisierungen
–cleanup löscht alte Docker-Images, wenn neue heruntergeladen und installiert wurden
–include-restarting startet aktualisierte Container nach update neu
–rolling-restart startet zu aktualisierende Container nacheinander und nicht alle gleichzeitig
–include-stopped aktualisiert auch die Container, welche derzeit gestoppt sind
Das Ergebnis siehst du dann gleich im Anschluss oben unmittelbar nach dem Kommando. Im o.a. Beispiel wurden 4 Container aktualisiert.
Wenn du eine automatische Aktualisierung ohne dein Zutun wünscht, dann führe folgendes Kommando aus:
$ docker run -it -d \
--name watchTower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--include-restarting \
--rolling-restart \
--include-stopped \
--interval 86400
Im Vergleich zum vorherigen Kommando führst du diesen als Deamon (-d = Hintergrunddienst) aus und das ganze mit einem Intervall von 86400 Sekunden, was dann 24 Stunden entspricht. Natürlich kannst du hier auch andere Timer setzen, ganz wie du willst. Mit diesen Optionen werden deine Docker-Container (die mit einem :latest) auf Aktualisierungen geprüft, ggf. heruntergeladen und installiert
Im Docker-Log schaut das dann wie folgt aus:
INFO[0001] Watchtower 1.4.0
INFO[0001] Using no notifications
INFO[0001] Checking all containers (except explicitly disabled with label)
INFO[0001] Scheduling first run: 2022-02-12 13:43:23 +0000 UTC
Bitte denke daran, Websocket-Support bei deinem Reverse Proxy zu aktivieren, ansonsten wirst du regelmäßig mit Verbindungsfehlern zu kämpfen haben:
Die Liste an weiteren Optionen ist lang, du kannst WatchTower ganz nach Belieben anpassen. Die Dokumenation der Entwickler findest du unter https://containrrr.dev/. Viel Erfolg 🙂
Hallo Lars,
eine sehr schöne Anleitung,
danke!
Danke für das positive Feedback.