Dans un fichier docker compose, nous retrouvons plusieurs services avec parfois des dépendances entre ces applications. Par exemple, une application backend pourrait avoir besoin d'une base de données disponible. On aurait une configuration de ce type
Copier le code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 services: app1: build: . container_name: app1 ports: - "8888:8888" volumes: - ./:/usr/src/app command: /bin/sh -c "poetry run fastapi dev app1.py --host 0.0.0.0 --port 8888" # Not do this in production depends_on: postgres postgres: image: postgres:latest container_name: postgres ports: - "5432:5432" environment: - POSTGRES_PORT=5432 - POSTGRES_DB=app - POSTGRES_USER=debug - POSTGRES_PASSWORD=debug
L'instruction
depends_on
app1
postgres
RUNNING
postgres
app1
Cette configuration ci-dessus est très utilisée, car cette base de données démarre plus vite que le backend
app1
Configuration healthy rabbitmq
Maintenant, nous allons prendre un exemple avec une base
rabbitmq
postgres
rabbitmq
healthy
RUNNING
app1
Copier le code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 services: app1: build: . container_name: app1 ports: - "8888:8888" volumes: - ./:/usr/src/app command: /bin/sh -c "poetry run fastapi dev app1.py --host 0.0.0.0 --port 8888" # Not do this in production depends_on: rabbitmq: condition: service_healthy rabbitmq: container_name: rabbitmq environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest image: rabbitmq:latest healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
Notre container
rabbitmq
healthcheck
docker composerabbitmq
HEALTHY
Cette information sera envoyée au service app1 car dans sa configuration, il est précisé
Copier le code
1 2 3 depends_on: rabbitmq: condition: service_healthy
Il vous reste à faire une
docker compose up
app1
rabbitmq
Configuration healthy custom
Dans l'exemple ci-dessus, on repose sur un outil proposé par
rabbitmq
Pour cela, on crée un autre service
app2
app1
rabbitmq
Copier le code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 services: app1: build: . container_name: app1 ports: - "8888:8888" volumes: - ./:/usr/src/app command: /bin/sh -c "poetry run fastapi dev app1.py --host 0.0.0.0 --port 8888" # Not do this in production depends_on: rabbitmq: condition: service_healthy # For app2, await this app1 are avaialble healthcheck: test: [ "CMD", "curl", "-f", "http://0.0.0.0:8888/health" ] app2: build: . container_name: app2 ports: - "8889:8889" volumes: - ./:/usr/src/app command: /bin/sh -c 'poetry run fastapi dev app2.py --host 0.0.0.0 --port 8889' # Not do this in production depends_on: app1: condition: service_healthy rabbitmq: container_name: rabbitmq environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest image: rabbitmq:latest healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
Sur notre
app1
Copier le code
1 2 healthcheck: test: [ "CMD", "curl", "-f", "http://0.0.0.0:8888/health" ]
Pour cela, nous faisons une requête http vers une route health qui a été configuré dans mon backend
La fonction retourne un simple message (exemple sur FastApi en python), la commande attend un retour
Copier le code
1 2 3 @app.get("/health") async def health(): return {"status": "OK"}
Et on indique au service
app2
app1
Copier le code
1 2 3 depends_on: app1: condition: service_healthy
Encore un
docker compose up
app2
app1
Si vous continuez à regarder vos logs, vous allez remarquer votre route
/health
interval
docker composeretry
interval
UNHEALTHY
Et via le dockerfile ?
Et via le dockerfile ?
On peut également mettre cette configuration dans le
Dockerfile
HEALTHCHECK --interval=10s --retry=2 CMD curl -f http://0.0.0.0:8888/health || exit 1
Il sera dans notre exemple utilisé pour
app1
app2
Conclusion
Conclusion
Et voilà 2 implémentations d'un health check avec
docker compose- En utilisant une commande fournie par l'éditeur (ici )
rabbitmq
- En configurant votre application avec une route à interroger