Synology DiskStation: Docker-Container automatisch aktualisieren mit Watchtower

Marcel Am 20.07.2021 veröffentlicht Lesezeit etwa 4:34 Minuten

Ich setze seit Jahren auf die NAS aus dem Hause Synology – namentlich DiskStation. Dies ist gar nicht in der Hardware begründet, vielmehr macht der DiskStation Manager (kurz: DSM) den Unterschied. Von Haus aus bringt dieses bereits viel mit und quasi modular aufgebaut bietet Synology selbst eine Vielzahl an Anwendungen aus den unterschiedlichsten Bereichen. Aber nicht nur der Hersteller selbst kann Pakete bereitstellen, sondern auch Drittentwickler. Nicht weniger spannend ist die Docker-Unterstützung. Eine Virtualisierungslösung, mit deren Hilfe sich in Kombination mit einem halbwegs potenter NAS-Hardware eine gefühlt unendliche Anzahl an weiteren Anwendungen ausgeführt werden können. Unter anderem die Netzwerk-Adblocker piHole und AdGuard oder Smart-Home-Anwendungen wie Homebridge und Home Assistant – das aber sind nur die prominentesten Beispiel. Manchmal mit etwas weniger, manchmal mit etwas mehr Aufwand.

Was aber etwas nervig ist, ist das Aktualisieren eines Containers. Hat man den Dreh einmal raus, ist das ganze recht zügig abgearbeitet: In der Docker-Registry das aktuelle Version des Images herunterladen, den vorhanden Container stoppen, die Inhalte des aktuellen Containers leeren und wieder starten. Angesichts dessen ist das fehlende automatische Update der Container eher ein kleines Luxusproblem, welches aber ab zwei oder drei aktiven Containern eine nervige Geschichte ist. Zumal man sich die Arbeit sparen kann, denn nur weil Synology keine solche Funktion ins System integriert hat, heißt das nicht, dass es sich nicht umsetzen lässt. Das Zauberwort hierzu lautet Watchtower. Ein Docker-Container, mit dem sich andere Docker-Container automatisch updaten lassen.

#1: Watchtower herunterladen

Zunächst einmal müsst ihr das aktuellste Watchtower-Image auf die DiskStation ziehen. Dies erledigt ihr über die Docker-GUI in der Weboberfläche. Also Docker öffnen, dort den Reiter „Registrierung“ aufrufen und flott „Watchtower“ in die Suche eintippen. Daraufhin erhaltet ihr diverse Container angeboten, wir greifen aber auf das offizielle Paket zurück: „containrrr/watchtower“:

Doppelklick auf die Zeile und als Tag „latest“ auswählen, falls dies nicht eh schon vorselektiert sein sollte:

Der Vorgang kann nun ein paar Minuten in Anspruch nehmen, sobald der Download erfolgreich abgeschlossen wurde, ist dies im Reiter „Images“ an dem blauen Icon ersichtlich – während des Download noch grau.

#2a: Watchtower per SSH starten

Watchtower besitzt keine eigene UI und auch ein übliches Ausführend der Container führt zu einem Fehler, da notwendige Symlinks fehlen und Docker-Container prinzipiell nur Zugriff auf ihre Daten besitzen. Am schnellsten ist der Aufruf von Watchtower, indem ihr euch mittels Root-Zugriff per SSH auf eure Diskstation einloggt – wer sich mit SSH bisher noch nicht beschäftigt hat, der findet nachfolgend unter dem Punkt „2b“ auch eine Möglichkeit, diesen Schritt ohne die vorherige SSH- und Root-Einrichtung abzufrühstücken. Der folgende Basisbefehl startet den Watchtower-Container, der alle Container auf aktualisiert, diese neu startet und sich anschließend selbst beendet:

docker run -d --network host --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:latest --cleanup --include-stopped --run-once

Die Parameter dürften selbsterklärend sein: Es wird der Symlink erstellt und das aktuelle Watchtower-Image genutzt. Der Befehl „cleanup“ sorgt dafür, dass alte Images nach dem Update gelöscht werden, „include stopped“ schließt auch aktuell beendete Container ein und „run-once“ besagt eine einmalige Watchtower Ausführung. Mit diesen Argumenten sind die prinzipiellen Werte gesetzt, wer tiefer in die Materie einsteigen möchte, der findet an dieser Stelle eine komplette Auflistung aller möglichen Argumente und Parameter. Noch interessant: Es ist möglich, nur bestimmte Container zu aktualisieren (oder umgekehrt bestimmte Container auszuschließen). Wollt ihr beispielsweise nur ausgewählte Container aktualisieren, reicht es aus, die Namen der Container einfach an den obigen Befehl anzufügen:

docker run -d --network host --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:latest --cleanup --include-stopped --run-once containername1 containername2

#2b: Erstmaliger Start ohne SSH

Wer sich ins Thema SSH und Root-Zugang bis dato noch nicht eingearbeitet hat, der kann dies nun erledigen oder aber den Umweg über den in DSM integrierten Aufgabenplaner gehen; diesen findet ihr standardmäßig in den Systemeinstellungen unter „System“. Dort angekommen klickt ihr auf den Button „Erstellen“ und anschließend auf „Geplante Aufgabe → Benutzerdefiniertes Skript“:

Dort vergebt ihr zunächst einen vernünftigen Namen und wählt „root“ als Benutzer aus:

Der Reiter Zeitplan ist erst einmal nicht weiter relevant, da wir die Aufgabe direkt nach der Erstellung manuell starten. Wichtiger ist der Reiter „Aufgabeneinstellung“: Dort müsst ihr in das Textfeld „Benutzerdefiniertes Skript“ den oben eingebundenen Befehl hinterlegen:

Ist die Aufgabe erstellt, markiert ihr diese in der Liste und wählt dann den Button „Ausführen“. Sobald die Aufgabe läuft, könnt ihr diese auch wieder löschen – oder aber ihr nutzt die bereits erstellte Aufgabe direkt für den 3. Schritt zum regelmäßigen Starten und Ausführen des Watchtower-Prozesses.

#3: Regelmäßige Prüfung aktivieren

Habt ihr den Watchtower dann erstmalig via SSH (oder dem Umweg Aufgabenplaner) gestartet, findet ihr den Container in der Docker-Übersicht vor. Nun könnt ihr diesen entweder immer manuell ausführen, indem ihr einfach den Schalter rechts in der Zeile umlegt. Deutlich komfortabler ist aber natürlich eine automatische regelmäßige Prüfung auf Updates und der Aktualisierung. Hierzu gäbe es die Möglichkeit, dies direkt über eine Erweiterung des SSH-Befehls zu machen, hierzu wird das Argument „–schedule“ oder „–interval“ bereitgestellt. Ich persönlich bevorzuge jedoch den Aufgabenplaner, einfach weil man es so besser im Blick hat. Hierzu legt ihr wie bereits in Schritt #2b beschrieben eine neue Aufgabe in Form eines benutzerdefinierten Skriptes an, wählt wieder „root“ als Nutzer aus und fügt dann den Befehl „docker start watchtower -a“ in das Textfeld unter „Aufgabeneinstellungen“:

Bevor ihr nun die Aufgabe erstellt, solltet ihr aber noch entsprechende Einstellungen am Zeitplan vornehmen. Vorgaben gibt es hier natürlich keine, es liegt alleine an euch, wie häufig ihr eine Update-Prüfung durchführen wollt. In meinem Falle passiert dies täglich um drei Uhr nachts:

#4: Noch eine Ergänzung ☝️🤓

Noch eine kleine Ergänzung zum Ende: Es kann hier und da notwendig sein, den Befehl zur Ausführung von Watchtower zu verändern. Zum Beispiel wenn gestoppte Container nicht beim Update berücksichtigt werden sollen, die Intervalle angepasst werden müssen (sofern ihr nicht mit dem Aufgabenplaner arbeitet) oder weil sich die Liste an zu aktualisierenden Containern geändert hat. In dem Falle müsst ihr den 2. Schritt wiederholen. Das klappt jedoch erst, nachdem ihr den bestehenden Container gelöscht habt, anderenfalls erhaltet ihr lediglich die Meldung, dass ein Container mit diesem Namen bereits existiert. Nicht dramatisch, sollte man aber bedenken um nicht kurzzeitig ein Fragezeichen über dem Kopf zu haben, insbesondere wenn man den Weg über den Aufgabenplaner geht, erhält man nämlich kein direktes Feedback. Und der Gedanke, dass der Befehl des bestehenden Containers einfach nur angepasst wird, hat sich als nicht richtig erwiesen…

Artikel teilen

Kaufempfehlung*

  • Anker 622 Magnetische Kabellose Powerbank (MagGo), 5000mAh Einklappbare Magnetische Powerbank mit USB-C für iPhone 13 und 12
  • Neu ab 51,99 €
  • Auf Amazon kaufen*

Schreibe den ersten Kommentar

Schreibe eine Antwort

⚠ Mit dem Nutzen des Kommentarbereiches erklärst du dich mit der Datenschutzerklärung einverstanden.