C'est quoi HEALTHCHECK
?
Il s'agit d'une instruction qui indique à Docker comment tester un conteneur pour vérifier qu'il fonctionne toujours correctement.
The HEALTHCHECK instruction tells Docker how to test a container to check that it is still working. This can detect cases such as a web server that is stuck in an infinite loop and unable to handle new connections, even though the server process is still running.
Si un conteneur s'arrête, il sera possible de relancer son processus principal à l'aide de RESTART
. Malheureusement le PID
de cet instance sera toujours actif et ne remplira pas son rôle correctement.
Par exemple dans le cas d'un serveur nginx
, il sera toujours UP mais il ne desservira plus les pages correctement et/ou remontera une erreur 404/503 !
Il existe alors plusieurs solutions :
HEALTHCHECK
au service pour vérifier sa bonne santé et ainsi avoir l’information en temps réel.Il est possible de déclarer un HEALTHCHECK
de deux façons :
Voici un exemple de fichier Dockerfile
qui va construire une image custom du CMS Ghost
:
FROM ghost:3
RUN apt update && apt install curl -y \
&& rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=1m --timeout=30s --retries=3 CMD curl --fail http://localhost:2368 || exit 1
Il est nécessaire d’installer curl qui n’est pas présent dans l’image.
Voici la liste des options qu’il est possible d’ajouter avant CMD
:
--interval=DUREE (default: 30s)
--timeout=DUREE (default: 30s)
--start-period=DUREE (default: 0s)
--retries=N (default: 3)
Ghost
étant une application web, l’utilisation de curl
ou wget
permet une vérification.
Dans cet exemple, on vérifie qu’une page web est présente et renvoie un code de retour 200 à l’adresse http://localhost:2368
.
Passons à la création de l'image :
docker build -t ghost:healthcheck
Puis on l'utilisepour créer un conteneur :
docker run -d --name some-ghost -p 2368:2368 ghost:healthcheck
On peut vérifier l’état de notre avec la commande docker ps
:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3435a4d95fd ghost:healthcheck "docker-entrypoint.s…" 3 seconds ago Up 1 second (health: starting) 0.0.0.0:2368->2368/tcp some-ghost
L’instruction HEALTHCHECK peut renvoyer 3 codes de retour :
0: success - the container is healthy and ready for use
1: unhealthy - the container is not working correctly
2: reserved - do not use this exit code
On constatera alors 3 états possibles :
On peut constater à l'aide de docker ps
que le conteneur est toujours en cours de démarrage : Le retour affiché est au statut starting
.
Attendons un peu puis vérifions de nouveau quelques secondes plus tard :
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3435a4d95fd ghost:healthcheck "docker-entrypoint.s…" About a minute ago Up About a minute (healthy) 0.0.0.0:2368->2368/tcp some-ghost
Le statut du conteneur est passé à Healthy
indiquant que celui-ci fonctionne correctement.
L'ajout d'un mécanisme de vérification dans une image est de ce fait assez simple
Il existe cepandant quelques "problèmes" liés à cette méthode :
Pour cet exemple je vais construire la même image sans HEALTHCHECK
mais toujours avec l’installation de curl :
FROM ghost:3
RUN apt update && apt install curl -y \
&& rm -rf /var/lib/apt/lists/*
On construit l'image :
docker build -t ghost:curl .
Les instructions sont similaires à la méthode vu précédemment :
version: '3.8'
services:
ghost:
image: ghost:curl
ports:
- 2368:2368
healthcheck:
test: ["CMD", "curl -f http://localhost:2368 || exit 1"]
timeout: 30s
interval: 1m
retries: 3
Le fonctionnement est identique à celui décrit lors d’une utilisation de l’instruction au sein d’un fichier Dockerfile.
Il est possible de désactiver dans votre docker-compose un healthcheck créé dans une image à l’aide de l’instruction suivante :
healthcheck:
disable: true