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:
docker ps
Pour voir si le conteneur est en cours d'exécutionmais ces deux semblent un peu excessif et laid. Me manque-t-il un meilleur moyen de vérifier si docker run
A réussi?
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.
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
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".
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": []
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...
;-)