web-dev-qa-db-fra.com

Comment détecter si l'exécution du menu fixe 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émarré correctement et que l'application à l'intérieur répond aux demandes.

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

Les solutions que je considère sont:

  • analyser la sortie pour les erreurs
  • docker ps Pour voir si le conteneur est en cours d'exécution

mais ces deux semblent un peu excessif et laid. Me manque-t-il un meilleur moyen de vérifier si docker run A réussi?

78
Jules Olléon

Comme suggéré par Abel Muiño dans les commentaires, cela a peut-être été corrigé dans les versions plus récentes de Docker (je suis actuellement en train d’exécuter la 0.9.1).

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

docker inspect renvoie un objet JSON contenant de nombreuses informations sur le conteneur, en particulier si le conteneur est en cours d'exécution ou non. Le -f drapeau permet d’extraire facilement les bits nécessaires:

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

ou

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

retournera true ou false.

Notez que vous voulez probablement sleep 1 (ou plus) entre le démarrage du conteneur et sa vérification. Si quelque chose ne va pas dans votre configuration, il est possible qu’elle apparaisse comme "en cours d’exécution" pendant très peu de temps avant de quitter.

113
Jules Olléon

Pour ne rien analyser, 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
21
pedroapero

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

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

9
simohe

Je devais utiliser:

$ docker inspect -f {{.State.Health.Status}} xxx

(le conteneur était à l'état en cours d'exécution mais le service à l'intérieur du conteneur n'a pas été complètement démarré.

Partie de la sortie inspectée:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []
1
lvthillo

Appliquer les suggestions susmentionnées à un script.

1 - Créez un script keepMyDockerUp.sh:

vi keepMyDockerUp.sh


#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2 - Ajoutez-le simplement à cron pour que votre script vérifie si votre conteneur Docker est actif de temps en temps:

crontab -e

Allez à la dernière ligne et ajoutez votre fichier de script. Par exemple:

* * * * * /root/keepMyDockerUp.sh

3 - Enregistrez crontab et ne vous inquiétez plus jamais de la fermeture de votre conteneur Docker.

J'espère que ça aide...

;-)

0
Israel