Letzte Aktualisierung am 20. März 2025


Watchtower ist ein Tool, dass deine Docker-Container aktuell hält. Dazu werden Container in regelmäßigen Abständen auf Updates geprüft, die mit einem speziellen Label gekennzeichnet sind. Im folgenden beschreibe ich, wie du Watchtower mithilfe von Portainer aus einem Git-Repository installierst.


Installation

Ich habe für mich watchtower in dieselbe Kategorie als Admin-Tool wie Portainer einsortiert. Daher lasse ich es im selben Docker-Netzwerk laufen wie Portainer. Dieses Netzwerk existiert bereits mit der Installation von Portainer, sodass kein neues erstellt werden muss.

Für die Installation eines Stacks aus einem Git-Repository müssen zunächst die notwendigen Dateien im Repository existieren. Wenn du wie im vorherigen Kapitel Entwicklungsumgebung beschrieben das Repository infra angelegt hast, dann hast du bereits im VSC eine leere Datei docker-compose.yml für Watchtower angelegt, die wir nun mit Leben füllen. Da Watchtower keine weiteren Angaben im Sinne von Umgebungsvariablen benötigt, gibt es keine .env-Datei.

Du öffnest also zunächst deinen Arbeitsbereich im VSC und darin die leere Datei docker-compose.yml im infra-Repository im Verzeichnis build/watchtower. Anschließend kopierst du die u.g. docker-compose.yml in die leere Datei und speicherst diese. Im VSC solltest du nun wieder den kleinen blauen Punkt an der Ansicht „Quellcodeverwaltung“ sehen, die die Veränderung deiner lokalen Datei docker-compose.yml anzeigt.

docker-compose.yml
services:
  watchtower:
    image: containrrr/watchtower
    restart: always
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/timezone:/etc/timezone:ro
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_INCLUDE_RESTARTING=true
    networks:
      - nw-dekayone-admin
    labels:
      # label in docker-compose der entsprechenden Container aufnehmen
      - com.centurylinklabs.watchtower.enable=true

networks:
  nw-dekayone-admin:
    external:
      true

Als nächstes wechselst du in die Ansicht „Quellcodeverwaltung“ und wählst „Commit und Push“ zusammen mit einer kurzen Nachricht, die die Veränderung im Repository beschreibt. Damit liegt die aktualisierte docker-compose.yml in deinem Repository.

Nun kannst du Watchtower mit Portainer und deinem Gitea als Git-Repository als Stack installieren. Dazu öffnest du dein Portainer, meldest dich mit deinem Benutzer an und wechselt über die linke Navigationsleiste über „Stacks“ in die Liste der angelegten Stacks. Darin legst du über die Schaltfläche „Add stack“ einen neuen Stack an.

Auf der folgenden Seite vergibst du einen Namen für deinen Stack, z.B. watchtower, und wählts die Option „Repository“. Daraufhin ändert sich die Ansicht für die Eingabemaske für die Angaben zum Zugriff auf dein Gitea.

Du könntest hier jetzt noch die Option „GitOps updates“ aktivieren und eine Zeitspanne eingeben, mit der Portainer zyklisch das angegebene Repository auf Updates prüft und den Stack automatisch aktualisiert. Ich lasse diese Option bisher deaktiviert, um die volle Kontrolle über die Aktualisierung meiner Stacks zu haben.
Wenn du auf der Seite weiter nach unten scrollst, kannst du alle weiteren Einstellungen belassen wie sie sind und über die Schaltfläche „Deploy the stack“ die Installation starten. Der erste Startvorgang wird etwas länger dauern, da Portainer zunächst das angegebene Image herunterladen muss bevor es schließlich in deiner Docker-Umgebung deployt wird.

Doch wie kommst du an die notwendigen Angaben für das Git-Repository?
„Username“ und „Personal Access Token“ sollten selbsterklärend sein, das ist dein Gitea-Nutzer samt passendem Kennwort. Die „Repository URL“ kannst du sehr leicht in Gitea herausfinden. Dazu meldest du dich an der Gitea-GUI an und navigierst zur Startseite deines infra-Repositories. Hier findest im Menü „<> Code“ im Abschnitt „Clone“ die HTTP-Adresse zum Repository. Diese Adresse kopierst du mit der Schaltfläche rechts neben der Eingabezeile und fügst sie anschließend als „Repository URL“ in der obigen Portainer-Ansicht für den Stack ein.

Das Feld „Repository reference“ kannst so belassen wie es ist. Damit wird auf den Hauptzweig deines Repositories verwiesen. Hier hast du generell die Möglichkeit auf andere Zweige in deinem Repository zuzugreifen.
Unter „Compose path“ trägst du den Pfad zum docker-compose.yml im Repository ein, in diesem Fall build/watchtower/docker-compose.yml.

Nach dem Klick auf „Deploy the stack“ dauert es einen Moment bis du wieder in der Liste der laufenden Stacks siehst. Hat dir Portainer während des Hochfahren des Stacks keine Fehlermeldung ausgegeben, siehst du nun in der Liste den neuen Stack watchtower. Wenn du den Namen anklickst, zeigt dir Portainer die Stackdetails an.


Wenn du Portainer nicht wie oben beschrieben im Zusammenspiel mit einem Git-Repository nutzen möchtest, kannst du stattdessen beim Anlegen eines Stacks die Option „Web editor“ wählen und die docker-compose.yml per Copy&Paste in den Editor kopieren. Der Start des Stacks erfolgt auch dann über die Schaltfläche „Deploy the stack“.


Nutzung

Mit der docker-compose.yml habe ich Watchtower so konfiguriert, dass es

  • alte Images in der Docker-Umgebung löscht
    WATCHTOWER_CLEANUP=true
  • nur solche Container auf Updates prüft, die das Label com.centurylinklabs.watchtower.enable=true nutzen
    WATCHTOWER_LABEL_ENABLE=true
  • die aktualisierten Container nach einem Update wieder startet
    WATCHTOWER_INCLUDE_RESTARTING=true

An dieser Stelle nochmals der Hinweis, dass Watchtower das Release-Tag der Container bewertet. Wenn du das Release-Tag latest verwendest, wird Watchtower den entsprechenden Container immer auf dem aktuellsten Releasestand halten. Das kann nicht immer sinnvoll sein, weil evtl. die Container in einem docker-compose.yml nur in bestimmten Releaseversionen miteinander funktionieren. In diesem Fall solltest du den Container nicht mit dem Watchtower-Label versehen.

Falls ihr mehrere Pi als Docker-Host verwendet und diese nicht in einem Docker Swarm zusammengefasst habt, müsst ihr Watchtower auf jedem Docker-Host installieren.


Quellen & Links

Schreibe einen Kommentar