Wie man den docker compose watch Befehl verwendet, um Services automatisch neu zu bauen

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie den Befehl docker compose watch nutzen können, um Ihre Docker-Services automatisch neu zu bauen und zu aktualisieren, wenn Dateiänderungen erkannt werden. Wir beginnen mit der Einrichtung eines einfachen Docker-Compose-Projekts mit einem Build-Kontext, der eine grundlegende Anwendungsdatei, ein Dockerfile und eine docker-compose.yaml-Datei umfasst.

Nach der Projekteinrichtung werden Sie die Kernfunktionalität von docker compose watch erkunden, um Dateiänderungen zu überwachen und automatische Neubuilds auszulösen. Wir werden außerdem die Option --no-up untersuchen, um Änderungen ohne initialen Service-Start zu beobachten, sowie die --quiet-Option, um die Build-Ausgabe zu unterdrücken und das Watch-Verhalten übersichtlicher darzustellen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555098{{"Wie man den docker compose watch Befehl verwendet, um Services automatisch neu zu bauen"}} docker/build -.-> lab-555098{{"Wie man den docker compose watch Befehl verwendet, um Services automatisch neu zu bauen"}} end

Ein einfaches Docker-Compose-Projekt mit Build-Kontext vorbereiten

In diesem Schritt richten wir ein einfaches Docker-Compose-Projekt mit einem Build-Kontext ein. Ein Build-Kontext bezeichnet die Gruppe von Dateien an einem bestimmten Ort (PATH oder URL), die an den Docker-Daemon gesendet werden, um ein Docker-Image zu erstellen. Dies ist wichtig, da das Dockerfile und alle benötigten Dateien (wie Anwendungscode) innerhalb des Build-Kontexts liegen müssen.

Zuerst erstellen wir ein Verzeichnis für unser Projekt. Wir nennen es my-watch-app.

mkdir ~/project/my-watch-app
cd ~/project/my-watch-app

Nun erstellen wir eine einfache Anwendungsdatei. Wir verwenden ein grundlegendes Python-Skript, das eine Nachricht ausgibt.

nano app.py

Fügen Sie folgenden Inhalt zu app.py hinzu:

print("Hello from the Docker container!")

Speichern und schließen Sie die Datei (Strg+X, Y, Enter).

Als Nächstes erstellen wir ein Dockerfile, das ein Image für unsere Anwendung baut. Das Dockerfile kopiert unser Python-Skript in das Image und führt es aus.

nano Dockerfile

Fügen Sie folgenden Inhalt zum Dockerfile hinzu:

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

CMD ["python", "app.py"]

Dieses Dockerfile verwendet ein schlankes Python-3.9-Image als Basis, setzt das Arbeitsverzeichnis auf /app, kopiert app.py in das /app-Verzeichnis und legt fest, dass das Python-Skript beim Start des Containers ausgeführt wird.

Abschließend erstellen wir eine docker-compose.yaml-Datei, um unseren Service zu definieren. Diese Datei teilt Docker Compose mit, wie unsere Anwendung gebaut und ausgeführt werden soll.

nano docker-compose.yaml

Fügen Sie folgenden Inhalt zu docker-compose.yaml hinzu:

version: "3.8"

services:
  myapp:
    build: .
    volumes:
      - .:/app

Diese docker-compose.yaml-Datei definiert einen Service namens myapp. Die Anweisung build: . weist Docker Compose an, das Image mit dem Dockerfile im aktuellen Verzeichnis (unserem Build-Kontext) zu bauen. Die Zeile volumes: - .:/app bindet das aktuelle Verzeichnis (.) auf dem Host-Rechner in das /app-Verzeichnis im Container ein. Dies ist entscheidend für docker compose watch, da Änderungen auf dem Host so im Container übernommen werden.

Nun bauen und starten wir unseren Service mit Docker Compose, um sicherzustellen, dass alles korrekt eingerichtet ist. Da Docker Compose nicht vorinstalliert ist, müssen wir es zuerst installieren.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Jetzt können wir docker-compose verwenden.

docker-compose up --build

Sie sollten eine Ausgabe sehen, die anzeigt, dass das Image gebaut wird und der Container läuft, wobei "Hello from the Docker container!" ausgegeben wird. Drücken Sie Strg+C, um den Container zu stoppen.

docker compose watch zur Überwachung von Dateiänderungen und Neubuilds verwenden

In diesem Schritt nutzen wir den Befehl docker compose watch, um unseren Service automatisch neu zu bauen und neu zu starten, wenn wir Änderungen am Anwendungscode vornehmen. Dies ist eine leistungsstarke Funktion für Entwicklungs-Workflows, die schnelle Iteration ermöglicht.

Der Befehl docker compose watch überwacht die Dateien in Ihrem Build-Kontext und kann bei erkannten Änderungen das Image automatisch neu bauen und den Service neu starten.

Stellen Sie sicher, dass Sie sich im Verzeichnis ~/project/my-watch-app befinden.

cd ~/project/my-watch-app

Führen Sie nun den Befehl docker compose watch aus.

docker-compose watch

Sie sehen eine Ausgabe, die anzeigt, dass Docker Compose den Service startet und auf Dateiänderungen wartet. Die initiale Ausgabe ähnelt der von docker-compose up.

Während docker compose watch in Ihrem Terminal läuft, öffnen Sie ein weiteres Terminal oder Tab. Navigieren Sie im neuen Terminal zum Projektverzeichnis.

cd ~/project/my-watch-app

Nun ändern wir die Datei app.py.

nano app.py

Ändern Sie den Inhalt zu:

print("Hello again from the updated Docker container!")

Speichern und schließen Sie die Datei (Strg+X, Y, Enter).

Wechseln Sie zurück zum Terminal, in dem docker compose watch läuft. Sie sollten eine Ausgabe sehen, die erkennt, dass eine Änderung detektiert wurde, das Image neu gebaut wird und der Container neu gestartet wird. Nach dem Neustart wird die neue Nachricht "Hello again from the updated Docker container!" ausgegeben.

Dies demonstriert, wie docker compose watch den Build- und Neustart-Prozess automatisch bei Codeänderungen durchführt.

Drücken Sie Strg+C im Terminal, in dem docker compose watch läuft, um den Prozess zu beenden.

Die --no-up-Option erkunden: Watch ohne initialen Build

In diesem Schritt untersuchen wir die --no-up-Option mit docker compose watch. Standardmäßig führt docker compose watch zunächst einen Build durch und startet die in Ihrer docker-compose.yaml-Datei definierten Services, bevor es mit der Überwachung von Dateiänderungen beginnt. Die --no-up-Option verhindert diesen initialen Build und Start. Dies ist nützlich, wenn Sie Änderungen überwachen möchten, ohne die Services sofort hochzufahren - etwa weil Sie sie später manuell starten wollen oder sie bereits laufen.

Stellen Sie sicher, dass Sie sich im Verzeichnis ~/project/my-watch-app befinden.

cd ~/project/my-watch-app

Führen Sie nun den Befehl docker compose watch mit der --no-up-Option aus.

docker-compose watch --no-up

Sie werden feststellen, dass die Ausgabe anders ist als im vorherigen Schritt. Docker Compose beginnt mit der Überwachung von Dateiänderungen, führt aber zunächst weder einen Build des Images noch einen Start des Containers durch. Die Ausgabe zeigt an, dass die angegebenen Pfade überwacht werden.

Während docker compose watch --no-up in Ihrem Terminal läuft, öffnen Sie ein weiteres Terminal oder Tab. Navigieren Sie im neuen Terminal zum Projektverzeichnis.

cd ~/project/my-watch-app

Nun ändern wir die Datei app.py erneut.

nano app.py

Ändern Sie den Inhalt zu:

print("Watching without initial up!")

Speichern und schließen Sie die Datei (Strg+X, Y, Enter).

Wechseln Sie zurück zum Terminal, in dem docker compose watch --no-up läuft. Sie sollten eine Ausgabe sehen, die erkennt, dass eine Änderung detektiert wurde und das Image neu gebaut wird. Der Container wird jedoch nicht automatisch neu gestartet, da wir die --no-up-Option verwendet haben.

Um die Auswirkung der Änderung zu sehen, müssen Sie den Service nach Abschluss des Rebuilds manuell in einem anderen Terminal starten.

docker-compose up

Sie sehen die neue Nachricht "Watching without initial up!", die vom Container ausgegeben wird.

Drücken Sie Strg+C im Terminal, in dem docker compose watch --no-up läuft, um den Watch-Prozess zu beenden. Drücken Sie Strg+C im Terminal, in dem docker-compose up läuft, um den Container zu stoppen.

Die --quiet-Option beobachten: Build-Ausgabe ausblenden

In diesem Schritt untersuchen wir die Wirkung der --quiet-Option mit docker compose watch. Standardmäßig zeigt docker compose watch bei der Erkennung von Änderungen und dem Neubuild eines Images die vollständige Ausgabe des Build-Prozesses an. Die --quiet-Option unterdrückt diese detaillierte Build-Ausgabe und zeigt nur wesentliche Informationen zum Watch-Prozess und Service-Neustarts an. Dies führt zu einer übersichtlicheren Ausgabe, besonders bei häufigen kleinen Änderungen.

Stellen Sie sicher, dass Sie sich im Verzeichnis ~/project/my-watch-app befinden.

cd ~/project/my-watch-app

Führen Sie nun den Befehl docker compose watch mit der --quiet-Option aus. Wir verwenden zusätzlich die --no-up-Option, um nur die Ausgaben zum Watch- und Rebuild-Prozess zu sehen, nicht den initialen Service-Start.

docker-compose watch --quiet --no-up

Sie sehen eine Ausgabe, die anzeigt, dass Docker Compose auf Dateiänderungen wartet, aber zunächst keine detaillierte Build-Ausgabe.

Während docker compose watch --quiet --no-up in Ihrem Terminal läuft, öffnen Sie ein weiteres Terminal oder Tab. Navigieren Sie im neuen Terminal zum Projektverzeichnis.

cd ~/project/my-watch-app

Nun ändern wir die Datei app.py ein letztes Mal.

nano app.py

Ändern Sie den Inhalt zu:

print("Quietly watching changes!")

Speichern und schließen Sie die Datei (Strg+X, Y, Enter).

Wechseln Sie zurück zum Terminal, in dem docker compose watch --quiet --no-up läuft. Sie sollten eine Ausgabe sehen, die erkennt, dass eine Änderung detektiert wurde und das Image neu gebaut wird, aber die detaillierten Schritte des Docker-Build-Prozesses werden ausgeblendet. Sie sehen nur eine kurze Meldung zum Rebuild.

Dies demonstriert, wie die --quiet-Option die Ausführlichkeit der Ausgabe während der durch docker compose watch ausgelösten Build-Phase reduziert.

Drücken Sie Strg+C im Terminal, in dem docker compose watch --quiet --no-up läuft, um den Watch-Prozess zu beenden.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man ein einfaches Docker Compose-Projekt mit einem Build-Kontext vorbereitet, was essenziell ist, um Docker-Images aus lokalen Dateien zu erstellen. Wir haben ein Projektverzeichnis angelegt, eine einfache Python-Anwendungsdatei (app.py), ein Dockerfile zum Bauen eines Images für die Anwendung sowie eine docker-compose.yaml-Datei erstellt, um den Service und seinen Build-Kontext zu definieren.

Anschließend haben wir den Befehl docker compose watch untersucht, der es ermöglicht, Dateiänderungen im Build-Kontext automatisch zu überwachen und Neubuilds des zugehörigen Services auszulösen. Wir haben gelernt, wie man diesen automatischen Rebuild-Prozess beobachtet und außerdem die Option --no-up kennengelernt, um ohne initialen Build zu überwachen, sowie die --quiet-Option, um die Build-Ausgabe zu unterdrücken. Dies ermöglicht einen optimierten Workflow für die Entwicklung.