Comment détecter si l’exécution de docker a réussi par programme?

J’écris un script bash très simple pour vérifier rapidement que mon conteneur est toujours construit et démarre correctement et que l’application à l’intérieur répond aux requêtes.

Parfois, l’ docker run échoue, par exemple parce que le port auquel j’essaie de lier le conteneur est déjà alloué. Mais lorsque cela se produit, le code de sortie de docker run est toujours 0, donc je ne peux pas utiliser le code de sortie. Comment puis-je vérifier par programme que le conteneur a démarré correctement?

Les solutions que je considère sont les suivantes:

  • parsingr les résultats pour les erreurs
  • docker ps pour voir si le conteneur est en cours d’exécution

mais ces deux semblent un peu excessives et laides. Est-ce que je manque un meilleur moyen de vérifier si docker run réussi?

Comme suggéré par Abel Muiño dans les commentaires, cela pourrait avoir été corrigé dans les versions plus récentes de Docker (j’utilise actuellement la version 0.9.1).

Mais si vous êtes temporairement bloqué comme moi avec une version plus ancienne, j’ai trouvé une solution de contournement décente pour vérifier si le conteneur a démarré en utilisant docker inspect .

docker inspect renvoie un object JSON avec beaucoup d’informations sur le conteneur, en particulier si le conteneur est en cours d’exécution ou non. L’indicateur -f vous permet d’extraire facilement les bits nécessaires:

 docker inspect -f {{.State.Running}} $CONTAINER_ID 

retournera true ou false .

Notez que vous souhaiterez probablement sleep 1 (ou plus) entre le démarrage du conteneur et sa vérification. S’il y a quelque chose qui ne va pas dans votre configuration, il est possible qu’elle apparaisse comme “en cours d’exécution” pendant une très courte période avant de quitter.

Pour éviter toute parsing, vous pouvez utiliser docker top , qui renvoie 1 si le conteneur n’est pas en cours d’exécution:

 id=$(docker run mycontainer) if ! docker top $id &>/dev/null then echo "Container crashed unexpectedly..." return 1 fi 

Nous pourrions utiliser docker exec $id true 2>/dev/null || echo not running docker exec $id true 2>/dev/null || echo not running .

Cette commande n’écrit pas sur stdout, contrairement à “docker top”. Il écrit dans stderr lorsque le conteneur n’est pas en cours d’exécution, le même message que “docker top”.