Wer viele Docker Container auf verschiedenen Server laufen hat sollte sich um die Aktualisierung Gedanken machen. Ich selbst betreibe privat zwei Server mit einer Traefik Installation. Hinter Traefik liegen diverse Anwendungen in unterschiedlicher Größe die ich regelmäßig manuell aktualisiere damit ich möglichst auf dem neusten Stand der Technik bin. Das ist wichtig damit Sicherheitslücken geschlossen werden oder Fehler in der Software behoben werden. Das gilt auch für Docker Container. Diese sollten auch immer aktuell gehalten werden. Die Einfachheit von Docker versteckt oft allerdings auch die genutzte Software die über mehrere Ebenen in einem Docker-Image verteilt sein kann.
Einen Ansatz den ich für meine privaten Projekte gefunden habe ist das Tool Watchtower. Es kann zu einem definierten Zeitpunkt oder in Intervallen die gestarteten Container analysieren. Zu jedem Container wird geprüft ob für diesen eine neue Version des Docker-Images vorliegt. Sofern vorhanden wird der Container gestoppt und mit dem neuen Docker-Image neugeneriert.
Das habe ich jetzt ein paar Tage ausprobiert und muss sagen, dass es tatsächlich gut funktioniert. Je nach Anwendung kann das aber auch nicht sinnvoll sein. Zum Beispiel habe ich eine Applikation die bei Schema-Änderungen auf der Datenbank nicht automatisch das Schema migriert. Man muss dann einmalig den Docker-Container mit einem Kommando zur Migration starten. Das würde mit Watchtower nicht funktionieren.
Watchtower kann glücklicherweise so konfiguriert werden, dass nur Container mit dem Label com.centurylinklabs.watchtower.enable=true
behandelt werden. Um das Verhalten zu aktivieren muss die Option --label-enable
beim Start von Watchtower mitgegeben werden.
Das sieht bei mir dann so aus:
version: "3.3"
services:
watchtower:
container_name: 'watchtower'
image: containrrr/watchtower
command: --cleanup --label-enable --schedule "0 23 5 \* \* \*"
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Watchtower ist bei mir so konfiguriert, dass immer um 5:23 Uhr (UTC) ein Update der Images erfolgt. Man kann aber auch ein Interval wie “jede Stunde” definieren. Hier sollte man aber im Hinterkopf behalten, dass das Tool im Hintergrund Docker-Images zum prüfen herunterlädt und entsprechende API Calls genutzt werden . Hier kann man auch in das neu eingeführte Docker-API Rate-Limit laufen.
Der Container braucht dann noch das Label und muss einmal manuell neugestartet werden.
Für meinen Traefik Server sieht das zum Beispiel so aus:
version: '3'
services:
traefik:
container_name: traefik
image: traefik:latest
restart: unless-stopped
ports:
# The HTTP ports
- "80:80"
- "443:44"
# The Web UI (enabled by --api)
- "8080:8080"
# imaps
- "993:993"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "./volumes/letsencrypt:/letsencrypt"
- "./volumes/etc/traefik:/etc/traefik"
labels:
- "traefik.enable=false"
- "com.centurylinklabs.watchtower.enable=true"
Vielleicht findet ihr die Idee ja gut oder findet eine andere Idee besser. Über einen Kommentar würde ich mich freuen.