Services, dépendances et healthchecks
L'ordre de démarrage des services et leur santé sont des problèmes récurrents dans les architectures multi-containers. "Le container de la base de données est lancé" ne signifie pas "la base de données est prête à accepter des connexions". depends_on + healthcheck résout ce problème correctement.
depends_on basique
services:
api:
depends_on:
- db # démarre db avant api, mais n'attend pas que db soit prêtLe depends_on simple garantit l'ordre de démarrage des containers, pas la disponibilité du service. L'API peut démarrer alors que PostgreSQL initialise encore ses fichiers de données.
depends_on avec condition
services:
api:
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5Avec condition: service_healthy, Compose attend que le healthcheck passe avant de démarrer le service dépendant.
Healthcheck dans le Dockerfile
HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --retries=3 CMD curl -f http://localhost:8080/health || exit 1Le healthcheck défini dans le Dockerfile est utilisé par Docker et Swarm. Celui défini dans Compose prend le dessus.
Restart policies
no(défaut) : ne redémarre jamaisalways: redémarre toujours, même après un arrêt manuel viadocker stopunless-stopped: redémarre automatiquement sauf si stoppé manuellement — recommandé en productionon-failure[:N]: redémarre si exit code non nul, N fois maximum
services:
api:
restart: unless-stopped
worker:
restart: on-failure:5 # stop après 5 échecs consécutifsRessources dans Compose
services:
api:
deploy:
resources:
limits:
cpus: '0.50'
memory: 256M
reservations:
cpus: '0.25'
memory: 128MEn mode Compose standalone (sans Swarm), la section deploy.resources est respectée depuis Compose v2. En Swarm, elle contrôle aussi le placement et le scheduling.