Passer au contenu principal

Compose (Docker)

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êt

Le 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: 5

Avec 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 1

Le 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 jamais
  • always : redémarre toujours, même après un arrêt manuel via docker stop
  • unless-stopped : redémarre automatiquement sauf si stoppé manuellement — recommandé en production
  • on-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écutifs

Ressources dans Compose

services:
  api:
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 256M
        reservations:
          cpus: '0.25'
          memory: 128M

En 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.