Une technique courante pour s'assurer qu'un conteneur est complètement démarré (c.-à-d. services en cours d'exécution, ports ouverts, etc.) consiste à attendre qu'une chaîne spécifique soit enregistrée. Voir cet exemple Attendre que les conteneurs Docker soient initialisés traitant de PostgreSql et de Rails.
Édité :
Il pourrait y avoir une autre solution en utilisant le HEALTHCHECK L'idée est de configurer le conteneur avec une commande de contrôle de santé qui est utilisée pour déterminer si le service principal est entièrement démarré et fonctionne normalement ou non. démarré et fonctionne normalement.
La commande spécifiée s'exécute à l'intérieur du conteneur et définit l'état de santé à starting
, healthy
o unhealthy
en fonction de son code de sortie (0 - le conteneur est sain, 1 - le conteneur n'est pas sain). L'état du conteneur peut ensuite être récupéré sur l'hôte en inspectant l'instance en cours d'exécution ( docker inspect
).
Les options de contrôle de santé peuvent être configurées dans Dockerfile
ou lorsque le conteneur est exécuté. Voici un exemple simple pour PostgreSQL
docker run --name postgres --detach \
--health-cmd='pg_isready -U postgres' \
--health-interval='5s' \
--health-timeout='5s' \
--health-start-period='20s' \
postgres:latest && \
until docker inspect --format "{{json .State.Health.Status }}" postgres| \
grep -m 1 "healthy"; do sleep 1 ; done
Dans ce cas, la commande de santé est pg_isready
. Un service web utilise généralement curl
les autres conteneurs ont leurs commandes spécifiques La communauté docker fournit ce type de configuration pour plusieurs images officielles aquí
Maintenant, lorsque nous redémarrons le conteneur ( docker start
), il est déjà configuré et nous n'avons besoin que de la deuxième partie :
docker start postgres && \
until docker inspect --format "{{json .State.Health.Status }}" postgres|\
grep -m 1 "healthy"; do sleep 1 ; done
La commande reviendra lorsque le conteneur sera marqué comme étant healthy
J'espère que cela vous aidera.