2 votes

Comment attendre que `docker start` soit terminé ?

Quand je cours docker start il semblerait que le conteneur n'ait pas été complètement démarré au moment où l'alerte a été donnée. docker start retourne la commande. C'est ainsi ?

Existe-t-il un moyen d'attendre que le conteneur soit complètement démarré avant que la commande ne revienne ? Merci.

2voto

b0gusb Points 2187

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.

1voto

Mark Bramnik Points 4472

Disclaimer, je ne suis pas un expert de Docker, et je serai heureux de savoir par moi-même si une meilleure solution existe.

Le système Docker ne sait pas vraiment que le conteneur "peut ne pas être complètement démarré".

Donc, malheureusement, il n'y a rien à faire avec cela dans Docker. Habituellement, les commandes utilisées par le créateur de l'image Docker (dans le Dockerfile) sont censées être organisées de manière à ce que le conteneur soit utilisable une fois que le fichier docker start La commande se termine sur l'image, et c'est le meilleur moyen. Cependant, ce n'est pas toujours le cas.

Voici un exemple :

Un Localstack, qui est un ensemble de services pour le développement local avec AWS, a une image docker, mais une fois qu'il a démarré, par exemple, le port S3 n'est pas encore prêt à recevoir des connexions. D'après ce que je comprends, un port non prêt bien qu'exposé est une situation typique à laquelle vous faites référence.

Donc, d'après mon expérience, dans l'application qui parle au processus Docker, la tentative de connexion au port du serveur devrait être incluse avec des tentatives et une fois qu'elle est disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X