Exercice 02 : Gérer les dépendances entre services
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Déclarer
depends_onpour imposer un ordre de démarrage - ✅ Ajouter un
healthchecksur un service base de données - ✅ Utiliser
condition: service_healthypour attendre qu'un service soit prêt - ✅ Configurer une politique
restartadaptée à chaque service - ✅ Démarrer la stack avec
docker compose up --wait
Durée estimée : 20 min | Difficulté : ⭐⭐⭐⭐☆
📖 Contexte
depends_on sans condition garantit uniquement que le conteneur dépendant est démarré avant l'autre, pas qu'il est prêt à accepter des connexions. Un service PostgreSQL peut prendre plusieurs secondes avant d'accepter des requêtes SQL. condition: service_healthy couplé à un healthcheck résout ce problème.
📋 Énoncé
Déployez une API Node.js qui se connecte à PostgreSQL. L'API ne doit démarrer qu'une fois la base de données réellement prête. En cas de crash, l'API doit redémarrer automatiquement.
🧭 Déroulement
Tâche 1 : Ajouter un healthcheck à PostgreSQL
Déclarez le service db (image postgres:16-alpine) avec un healthcheck qui exécute pg_isready toutes les 5 secondes, avec un timeout de 5 secondes et 5 tentatives avant de passer en état unhealthy.
Indice : La commande de test doit être fournie sous forme de liste :
["CMD-SHELL", "pg_isready -U postgres"].
Vérification : docker compose ps affiche (healthy) dans la colonne STATUS après le démarrage.
Tâche 2 : Conditionner le démarrage de l'API
Ajoutez un service api (image node:20-alpine) avec depends_on configuré pour attendre que db soit service_healthy avant de démarrer.
Indice :
`yamldepends_on:
db:
condition: service_healthy
`
Vérification : Dans les logs, l'API démarre après que PostgreSQL affiche database system is ready to accept connections.
Tâche 3 : Configurer les politiques de redémarrage
Ajoutez restart: unless-stopped sur le service api et restart: always sur le service db.
Indice :
unless-stoppedredémarre le conteneur sauf s'il a été arrêté manuellement.alwaysredémarre y compris après un reboot du daemon Docker.
Vérification : Arrêtez manuellement le conteneur api avec docker stop - il redémarre automatiquement après quelques secondes.
Tâche 4 : Démarrer avec --wait
Lancez la stack avec docker compose up --wait pour que la commande ne rende la main qu'une fois tous les services healthy.
Indice : Sans
--wait,docker compose up -drend la main immédiatement sans attendre les healthchecks.
Vérification : La commande se termine uniquement quand docker compose ps indique healthy pour db.
🗂️ Mini-Projet
Complétez les points suivants :
- Le healthcheck de
dbest visible dansdocker inspect <container_db> docker compose psaffiche(healthy)pour le servicedb- Supprimer et recréer la stack - l'API ne démarre jamais avant que
dbsoit healthy - Tuer le processus
apimanuellement - il redémarre grâce àrestart: unless-stopped docker compose up --waitbloque jusqu'à ce que tous les services soient prêts