Contrôler l'ordre de démarrage et d'arrêt dans Compose
Vous pouvez contrôler l'ordre de démarrage et d'arrêt des services avec l'attribut
depends_on. Compose démarre et arrête toujours
les conteneurs dans l'ordre des dépendances, où les dépendances sont déterminées par
depends_on
, links
, volumes_from
, et network_mode: "service:..."
.
Un bon exemple de quand vous pourriez utiliser ceci est une application qui a besoin d'accéder à une base de données. Si les deux services sont démarrés avec docker compose up
, il y a une chance que cela échoue car le service d'application pourrait démarrer avant le service de base de données et ne trouvera pas de base de données capable de gérer ses instructions SQL.
Contrôler le démarrage
Au démarrage, Compose n'attend pas qu'un conteneur soit "prêt", seulement qu'il soit en cours d'exécution. Cela peut causer des problèmes si, par exemple, vous avez un système de base de données relationnelle qui doit démarrer ses propres services avant de pouvoir gérer les connexions entrantes.
La solution pour détecter l'état prêt d'un service est d'utiliser l'attribut condition
avec l'une des options suivantes :
service_started
service_healthy
. Ceci spécifie qu'une dépendance est attendue pour être "saine", ce qui est défini avechealthcheck
, avant de démarrer un service dépendant.service_completed_successfully
. Ceci spécifie qu'une dépendance est attendue pour s'exécuter jusqu'à la complétion réussie avant de démarrer un service dépendant.
Exemple
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s
Compose crée les services dans l'ordre des dépendances. db
et redis
sont créés avant web
.
Compose attend que les vérifications de santé passent sur les dépendances marquées avec service_healthy
. db
est attendu pour être "sain" (comme indiqué par healthcheck
) avant que web
ne soit créé.
restart: true
assure que si db
est mis à jour ou redémarré en raison d'une opération Compose explicite, par exemple docker compose restart
, le service web
est également redémarré automatiquement, assurant qu'il rétablit correctement les connexions ou les dépendances.
La vérification de santé pour le service db
utilise la commande pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}
pour vérifier si la base de données PostgreSQL est prête. Le service est réessayé toutes les 10 secondes, jusqu'à 5 fois.
Compose supprime également les services dans l'ordre des dépendances. web
est supprimé avant db
et redis
.