Estoy escribiendo un script bash muy simple para verificar rápidamente que mi contenedor aún se construye y se inicia correctamente y que la aplicación interna responde a las solicitudes.
A veces docker run
falla, por ejemplo, porque el puerto al que estoy tratando de vincular el contenedor ya está asignado. Pero cuando esto sucede docker run
, el código de salida sigue siendo 0, por lo que no puedo usar el código de salida. ¿Cómo puedo comprobar mediante programación que el contenedor se inició correctamente?
Las soluciones que estoy considerando son:
- analizar la salida en busca de errores
docker ps
para ver si el contenedor está funcionando
pero ambos parecen un poco exagerados y feos. ¿Me estoy perdiendo una forma mejor de comprobar si se ha realizado docker run
correctamente?
docker run
devolverá un código de retorno distinto de cero en caso de falla, como lo indica, todo lo que puede hacer es analizar la salida (que puede ser complicada o frágil) o usar otro comando (es decir, sups
sugerencia ) para comprobar el resultado del primer comando. Es posible que desee considerar la posibilidad de presentar un ticket con Docker para ver si pueden corregir el código de retornorun
también.docker run -d -p 9010:9010 busybox true ; echo $?
Respuestas:
Como sugirió Abel Muiño en los comentarios, esto puede haberse solucionado en versiones más recientes de Docker (actualmente estoy ejecutando 0.9.1).
Pero, si está atrapado temporalmente como yo con una versión anterior, encontré una solución decente para verificar si el contenedor comenzó a usar
docker inspect
.docker inspect
devuelve un objeto JSON con mucha información sobre el contenedor y, en particular, si el contenedor se está ejecutando actualmente o no. La-f
bandera le permite extraer fácilmente los bits necesarios:docker inspect -f {{.State.Running}} $CONTAINER_ID
o
docker inspect -f "{{.State.Running}}" $CONTAINER_ID
volverá
true
ofalse
.Tenga en cuenta que probablemente desee
sleep 1
(o más) entre iniciar el contenedor y verificar si está activo. Si hay algún problema con su configuración, es posible que aparezca como "en ejecución" durante muy poco tiempo antes de salir.fuente
docker inspect -f {{.State.Running}} <container-id>
y usarjq
en su lugar? Sólo me preguntaba.2> /dev/null
.2> /dev/null
ya que no evalúa nada. ¿Cómo puedo hacer que sea predeterminadofalse
si el contenedor no existe?Para evitar analizar cualquier cosa, puede usar docker top , que devuelve 1 si el contenedor no se está ejecutando:
id=$(docker run mycontainer) if ! docker top $id &>/dev/null then echo "Container crashed unexpectedly..." return 1 fi
fuente
Podríamos usar
docker exec $id true 2>/dev/null || echo not running
.Este comando no escribe en stdout, como lo hace "docker top". Escribe en stderr cuando el contenedor no se está ejecutando, el mismo mensaje que "docker top".
fuente
Aplicar las sugerencias antes mencionadas a un guión.
1 - Cree 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 - Luego, simplemente agréguelo a cron, para que su script verifique si su contenedor Docker está activo de vez en cuando:
Vaya a la última línea y agregue su archivo de secuencia de comandos. Por ejemplo:
3 - Guarde crontab y nunca se preocupe de que su contenedor Docker se caiga nuevamente.
Espero eso ayude...
;-)
fuente
Tuve que usar:
(el contenedor estaba en ejecución, pero el servicio dentro del contenedor no se inició por completo.
Parte de la salida de inspección:
"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": []
fuente