Docker Container automatisch aktualisieren
Wenn man Docker Container auf seinem Server betreibt, möchte man
natürlich, dass diese auch immer auf dem neusten Stand sind. Das dient
auch zur Server- und Datensicherheit bei. Um sicherzugehen, dass man
keine Updates verpasst, sollte man alle paar Tage die Container überprüfen. Das kann lästig werden und irgendwann schläft das Thema bei einem ein.
Watchtower hilft und so richtet ihr es ein
Dieses Problem habe ich mit Watchtower erfolgreich gelöst. Nach der Installation werden alle Container in regelmäßigen Abständen auf Updates kontrolliert.
Wie ich das gemacht habe? Ich erzähle es Euch.
Und so geht es…
Das Setup
Zuerst sollte man sich mit dem eigenen Server verbinden und zum Root-User bzw. zu dem User unter dem Docker Service läuft, wechseln.
Einfach halber hier mit dem Root-User.
Danach begibt man sich auf die Github Seite und liest sich mal die README durch.
Auf dem Server erstellt man in einem eindeutigen Verzeichnis, wo man die Datei auch wieder findet, eine Docker-compose.yml Datei, sofern noch nicht vorhanden und fügt folgendes ein:
vi docker.compose.yml
selektive Containerauswahl:
version: '2.2'
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: watchtower openvpn-as nextcloud Aria2 collabora onlyoffice openvpn wordpress_wordpress_1 wordpress_mariadb_1 matomo_application_1 matomo_mariadb_1 bitward_bitwarden_1 --schedule '0 0 0 * * *' --cleanup --debug
environment:
- TZ='Europe/Berlin'
#- REPO_USER='githubuser'
#- REPO_PASS='password'
#- WATCHTOWER_NOTIFICATIONS=email
#- WATCHTOWER_NOTIFICATION_EMAIL_FROM=server@Domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_TO=mail@domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mail@domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=Secret
restart: always
selektiv Container aktualisieren
command: <containerid> <containerid2> --interval 30
Dieser Code sorgt dafür, dass die Überprüfung alle 30 Minuten ausgeführt wird. In unserem Beispiel werden die Container mit dem Namen Watchtower, Pihole, Office, Firefox-syncserver und aria2c überprüft und bei Bedarf aktualisiert.
Kleine Anmerkung:
Watchtower aktualisiert generell alle Container, die laufen. Nur wenn man ,wie ich, selektiv aktualisieren möchte, werden die Containernamen eingetragen.
Zeitpunkt zum aktualisieren setzen
Wenn man nicht tagsüber die Container aktualisierten lassen möchte, kann man dies auch auf die gewünschte Zeit verschieben.
--schedule '0 0 0 * * *' --cleanup --debug
Mit dieser Anweisung wird das überprüfen und das eventuelle aktualisieren auf die Nacht verschoben und die alten Images anschließend gelöscht. Mit debug erhalte ich eine genauere Logausgabe.
Email-Benachrichtigung
Ganz gut zum debuggen ist das senden einer Email wenn ein Container aktualisiert wurde. Dies geschieht mit folgendem Eintrag. Ich habe aber eine Raute davor gesetzt, da aktuell alles läuft wie gewünscht. So läuft alles stillschweigend nachts ab und werde nicht genervt mit Emails. ?
- WATCHTOWER_NOTIFICATIONS=email
#- WATCHTOWER_NOTIFICATION_EMAIL_FROM=server@Domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_TO=mail@domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mail@domain.tld
#- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=Secret
Container starten
Hat man den Block nun für sich angepasst, speichert man die docker-compose.yml Datei ab und führt diese aus.
docker-compose up -d
Der Container sollte nun starten. Sobald die ersten Updates durchgelaufen sind, schaut man in die Log Datei des Watchtower Containers. sudo Docker Logs <watchtowerid> Die Ausgabe sollte ungefähr so aussehen:
[...]
time="2018-09-16T14:57:50Z" level=info msg="Found new crazymax/firefox-syncserver:latest image (sha256:ca246670c21f134a6f3fbb360da0158f0e78a24f07e8aa6ed645f2b2e5465e4c)"
time="2018-09-16T14:57:51Z" level=info msg="Stopping /firefox-syncserver (2e6fd27c9978f16852444e9ece1015c5b5c68ce74e922dea8a9f53760d0cb8b4) with SIGTERM"
time="2018-09-16T14:58:05Z" level=info msg="Creating /firefox-syncserver"
time="2018-09-21T19:42:55Z" level=info msg="Unable to update container /aria2c, err='Error response from daemon: Get https://registry-1.docker.io/v2/abcminiuser/docker-aria2-with-webui/manifests/latest-ng: Get https://auth.docker.io/token?scope=repository%3Aabcminiuser%2Fdocker-aria2-with-webui%3Apull&service=registry.docker.io: net/http: TLS handshake timeout'. Proceeding to next."
time="2018-09-22T18:00:10Z" level=info msg="Waiting for running update to be finished..."
time="2018-09-22T18:07:55Z" level=info msg="First run: 2018-09-22 18:12:55 +0000 UTC"
time="2018-09-27T19:18:00Z" level=info msg="Found new crazymax/firefox-syncserver:latest image (sha256:7ee3b2546928be7c60372923530ce448afba447a7458acea077e6a08d667cf7d)"
time="2018-09-27T19:18:04Z" level=info msg="Stopping /firefox-syncserver (f3893fe0d3ee933d0dd40ebbfc4e201fd19d4f8c80310300770b7e06d02d6869) with SIGTERM"
time="2018-09-27T19:18:18Z" level=info msg="Creating /firefox-syncserver"
[...]
Ich hoffe ihr habt dieses kurze Tutorial verstanden, sollten Fragen auftauchen fragt mich einfach indem ihr einen Kommentar unter diesen Artikel schreibt. Ihr könnt natürlich auch schreiben wenn die Anleitung funkioniert hat. ?