Comment utiliser la commande docker compose watch pour reconstruire automatiquement les services

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce lab, vous apprendrez à utiliser la commande docker compose watch pour reconstruire et mettre à jour automatiquement vos services Docker en réponse aux modifications de fichiers. Nous commencerons par configurer un projet Docker Compose simple avec un contexte de build, incluant un fichier d'application basique, un Dockerfile et un fichier docker-compose.yaml.

Après la configuration du projet, vous explorerez la fonctionnalité principale de docker compose watch pour surveiller les modifications de fichiers et déclencher des reconstructions automatiques. Nous examinerons également l'option --no-up pour surveiller les changements sans démarrage initial du service, ainsi que l'option --quiet pour supprimer la sortie de build, vous permettant d'observer plus clairement le comportement de surveillance.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555098{{"Comment utiliser la commande docker compose watch pour reconstruire automatiquement les services"}} docker/build -.-> lab-555098{{"Comment utiliser la commande docker compose watch pour reconstruire automatiquement les services"}} end

Préparer un projet Docker Compose simple avec un contexte de build

Dans cette étape, nous allons préparer un projet Docker Compose simple incluant un contexte de build. Un contexte de build est l'ensemble des fichiers situés à un emplacement spécifié (PATH ou URL) qui sont envoyés au démon Docker pour construire une image Docker. Ceci est important car le Dockerfile et tous les fichiers nécessaires (comme le code de l'application) doivent se trouver dans le contexte de build.

Commencez par créer un répertoire pour notre projet. Nous le nommerons my-watch-app.

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

Maintenant, créons un fichier d'application simple. Nous utiliserons un script Python basique qui affiche un message.

nano app.py

Ajoutez le contenu suivant dans app.py :

print("Hello from the Docker container!")

Enregistrez et fermez le fichier (Ctrl+X, Y, Entrée).

Ensuite, nous devons créer un Dockerfile qui construira une image pour notre application. Le Dockerfile copiera notre script Python dans l'image puis l'exécutera.

nano Dockerfile

Ajoutez le contenu suivant dans le Dockerfile :

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

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

Ce Dockerfile utilise une image Python 3.9 slim comme base, définit le répertoire de travail sur /app, copie app.py dans le répertoire /app, et enfin définit la commande pour exécuter le script Python au démarrage du conteneur.

Enfin, nous devons créer un fichier docker-compose.yaml pour définir notre service. Ce fichier indiquera à Docker Compose comment construire et exécuter notre application.

nano docker-compose.yaml

Ajoutez le contenu suivant dans docker-compose.yaml :

version: "3.8"

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

Ce fichier docker-compose.yaml définit un service nommé myapp. L'instruction build: . indique à Docker Compose de construire l'image en utilisant le Dockerfile du répertoire courant (qui est notre contexte de build). La ligne volumes: - .:/app monte le répertoire courant (.) de la machine hôte dans le répertoire /app du conteneur. Ceci est crucial pour docker compose watch car il permet aux modifications sur l'hôte d'être reflétées dans le conteneur.

Maintenant, construisons et exécutons notre service avec Docker Compose pour vérifier que tout est correctement configuré. Comme Docker Compose n'est pas préinstallé, nous devons d'abord l'installer.

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

Nous pouvons maintenant utiliser docker-compose.

docker-compose up --build

Vous devriez voir une sortie indiquant que l'image est en cours de construction et que le conteneur s'exécute, affichant "Hello from the Docker container!". Appuyez sur Ctrl+C pour arrêter le conteneur.

Utiliser docker compose watch pour surveiller les modifications et reconstruire

Dans cette étape, nous allons utiliser la commande docker compose watch pour reconstruire et redémarrer automatiquement notre service lorsque nous modifions le code de l'application. Cette fonctionnalité puissante est idéale pour les workflows de développement, permettant des itérations rapides.

La commande docker compose watch surveille les fichiers dans votre contexte de build et, lorsqu'elle détecte des modifications, peut automatiquement reconstruire l'image et redémarrer le service.

Assurez-vous d'être dans le répertoire ~/project/my-watch-app.

cd ~/project/my-watch-app

Maintenant, exécutez la commande docker compose watch.

docker-compose watch

Vous verrez une sortie indiquant que Docker Compose démarre le service et surveille les modifications de fichiers. La sortie initiale sera similaire à l'exécution de docker-compose up.

Pendant que docker compose watch s'exécute dans votre terminal, ouvrez un autre terminal ou onglet. Naviguez vers le répertoire du projet dans le nouveau terminal.

cd ~/project/my-watch-app

Maintenant, modifions le fichier app.py.

nano app.py

Changez le contenu pour :

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

Enregistrez et fermez le fichier (Ctrl+X, Y, Entrée).

Retournez au terminal où docker compose watch s'exécute. Vous devriez voir une sortie indiquant qu'une modification a été détectée, que l'image est en cours de reconstruction et que le conteneur est redémarré. Après le redémarrage, le nouveau message "Hello again from the updated Docker container!" sera affiché.

Ceci démontre comment docker compose watch gère automatiquement le processus de build et de redémarrage lorsque votre code change.

Appuyez sur Ctrl+C dans le terminal exécutant docker compose watch pour arrêter le processus.

Explorer l'option --no-up pour surveiller sans construction initiale

Dans cette étape, nous allons explorer l'option --no-up avec docker compose watch. Par défaut, docker compose watch construit et démarre les services définis dans votre fichier docker-compose.yaml avant de commencer à surveiller les modifications de fichiers. L'option --no-up empêche cette construction et ce démarrage initiaux. Ceci est utile si vous souhaitez commencer à surveiller les changements sans immédiatement démarrer les services, peut-être parce que vous prévoyez de les démarrer manuellement plus tard ou qu'ils sont déjà en cours d'exécution.

Assurez-vous d'être dans le répertoire ~/project/my-watch-app.

cd ~/project/my-watch-app

Maintenant, exécutez la commande docker compose watch avec l'option --no-up.

docker-compose watch --no-up

Vous remarquerez que la sortie est différente de l'étape précédente. Docker Compose commencera à surveiller les modifications de fichiers mais ne construira pas l'image ni ne démarrera le conteneur initialement. La sortie indiquera qu'il surveille les chemins spécifiés.

Pendant que docker compose watch --no-up s'exécute dans votre terminal, ouvrez un autre terminal ou onglet. Naviguez vers le répertoire du projet dans le nouveau terminal.

cd ~/project/my-watch-app

Maintenant, modifions à nouveau le fichier app.py.

nano app.py

Changez le contenu pour :

print("Watching without initial up!")

Enregistrez et fermez le fichier (Ctrl+X, Y, Entrée).

Retournez au terminal où docker compose watch --no-up s'exécute. Vous devriez voir une sortie indiquant qu'une modification a été détectée et que l'image est en cours de reconstruction. Cependant, le conteneur ne redémarrera pas automatiquement car nous avons utilisé l'option --no-up.

Pour voir l'effet du changement, vous devrez démarrer manuellement le service dans un autre terminal une fois la reconstruction terminée.

docker-compose up

Vous verrez le nouveau message "Watching without initial up!" affiché par le conteneur.

Appuyez sur Ctrl+C dans le terminal exécutant docker compose watch --no-up pour arrêter le processus de surveillance. Appuyez sur Ctrl+C dans le terminal exécutant docker-compose up pour arrêter le conteneur.

Observer l'option --quiet pour masquer la sortie de construction

Dans cette étape, nous allons observer l'effet de l'option --quiet avec docker compose watch. Par défaut, lorsque docker compose watch détecte un changement et reconstruit une image, il affiche l'intégralité de la sortie du processus de construction. L'option --quiet supprime cette sortie détaillée, n'affichant que les informations essentielles sur le processus de surveillance et les redémarrages de service. Cela permet d'obtenir une sortie plus claire, particulièrement utile pour des modifications fréquentes et mineures.

Assurez-vous d'être dans le répertoire ~/project/my-watch-app.

cd ~/project/my-watch-app

Maintenant, exécutez la commande docker compose watch avec l'option --quiet. Nous inclurons également à nouveau l'option --no-up afin de ne voir que la sortie relative au processus de surveillance et de reconstruction, sans l'affichage du démarrage initial du service.

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

Vous verrez une sortie indiquant que Docker Compose surveille les modifications de fichiers, mais aucune sortie détaillée de construction ne s'affichera initialement.

Pendant que docker compose watch --quiet --no-up s'exécute dans votre terminal, ouvrez un autre terminal ou onglet. Naviguez vers le répertoire du projet dans le nouveau terminal.

cd ~/project/my-watch-app

Maintenant, modifions une dernière fois le fichier app.py.

nano app.py

Changez le contenu pour :

print("Quietly watching changes!")

Enregistrez et fermez le fichier (Ctrl+X, Y, Entrée).

Retournez au terminal où docker compose watch --quiet --no-up s'exécute. Vous devriez voir une sortie indiquant qu'un changement a été détecté et que l'image est en cours de reconstruction, mais les étapes détaillées du processus de construction Docker seront masquées. Vous ne verrez qu'un message concis concernant la reconstruction.

Ceci démontre comment l'option --quiet réduit la verbosité de la sortie pendant la phase de construction déclenchée par docker compose watch.

Appuyez sur Ctrl+C dans le terminal exécutant docker compose watch --quiet --no-up pour arrêter le processus de surveillance.

Résumé

Dans ce lab, nous avons appris à préparer un projet Docker Compose simple avec un contexte de build, essentiel pour construire des images Docker à partir de fichiers locaux. Nous avons créé un répertoire de projet, un fichier d'application Python basique (app.py), un Dockerfile pour construire une image de l'application, et un fichier docker-compose.yaml pour définir le service et son contexte de build.

Nous avons ensuite exploré la commande docker compose watch, qui nous permet de surveiller automatiquement les modifications de fichiers dans le contexte de build et de déclencher des reconstructions du service associé. Nous avons appris à utiliser cette commande pour observer ce processus de reconstruction automatique, et avons également exploré l'option --no-up pour surveiller sans construction initiale et l'option --quiet pour masquer la sortie de build, offrant ainsi un flux de travail optimisé pour le développement.