J'ai eu un peu de temps pour tester, c'est prometteur mais pas encore ça... j'explique.
J'ai créé 2 conteneurs grâce à 2 dockerfiles. Le premier qu'on va appeler "check" permet de faire les vérifications (présence de 2 dossiers sur la machine hôte) et pour celui-la j'aurais un healthcheck mis en place pour connaître son état. Le second qu'on va appeler "principal" est mon conteneur principal qui fait tourner le service dont j'ai besoin (pour le test c'est un conteneur simple avec un sleep 3600).
Dockerfile "check" :
FROM debian:latest
RUN mkdir /config && mkdir /mnt/complet && mkdir /mnt/incomplet
WORKDIR /config/
VOLUME /config
VOLUME /mnt/complet
VOLUME /mnt/incomplet
ENTRYPOINT /config/wait-for-mount.sh
Dockerfile "principal" :
FROM debian:latest
ENTRYPOINT sleep 3600
Docker-compose pour les 2 conteneurs :
---
version: "2.1"
services:
check:
image: check
container_name: check
volumes:
- /home/user/docker/check/config:/config:ro
- /mnt/complet:/mnt/complet:ro
- /mnt/incomplet:/mnt/incomplet:ro
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "ls -l /tmp/healthy"]
interval: 30s
timeout: 10s
retries: 3
principal:
image: principal
container_name: principal
depends_on:
check:
condition: service_healthy
Le script utilisé en entrypoint pour le conteneur "check" (wait-for-mount.sh) :
#!/bin/bash
# wait-for-mount.sh
sleep 10
while true
do
[ -d "/mnt/complet/Films" ] || exit 1
[ -d "/mnt/incomplet/Films" ] || exit 1
done
if [ ! -f "/tmp/healthy" ]
then
touch /tmp/healthy
fi
sleep 15
done
Donc si on résume :
- mon conteneur "principal" dépend de l’état du conteneur "check" (celui-ci doit être "healthy")
- mon conteneur "check", lorsqu'il est lancé, vérifie la présence de 2 dossiers qui doivent exister lorsque les partages NFS sont montés dans /mnt/complet/ et /mnt/incomplet/
- si 1 des dossiers n'existe pas alors le conteneur "check" est redémarré (exit 1)
- si tout est bon, alors le script crée un fichier "/tmp/healthy" dans le conteneur qui permet lors du healthcheck de dire que tout va bien, ce qui ensuite lance le conteneur "principal"
J'ai fais quelques tests et ça à l'air de marcher à première vue. MAIS, parce que s'il n'y avait pas de "mais", je n'aurais pas écris ce gros pâté 🙂
Si mon conteneur "check" devient "unhealthy" à cause d'un des dossiers qui n'existe plus, le conteneur "principal" continue de tourner comme si de rien n’était. J'en déduis que le "depend_on" n'est effectivement pris en compte que lors du lancement du conteneur "principal" et plus du tout après. Est-ce correct? Si c'est ça, c'est embêtant, parce que je voulais continuer à vérifier la présence des 2 dossiers durant le fonctionnement des 2 conteneurs pour, en cas de problème sur l'un des dossiers, que le conteneur "check" soit redémarré (grâce au "exit 1" dans le script) et que le conteneur "principal" soit arrêté (par Docker, puis-ce que le conteneur "check" est "unhealthy") jusqu’à ce que le conteneur "check" redevienne "healthy". Dans le cas où le healthcheck n'est vérifié qu'au lancement, je n'ai plus aucune utilité pour le conteneur "check" ensuite (il pourrait donc arrêter de tourner)...
Mes suppositions sont-elles bonnes? Avez-vous une autre vision ou une autre idée pour que le "depend_on" soit pris en compte tout au long du cycle de vie du conteneur "principal"?