bash - run - docker start image
¿Cómo detectar si Docker Run tuvo éxito programáticamente? (3)
Para evitar analizar nada, puede usar la parte superior de la ventana acoplable , 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
Estoy escribiendo un guión bash muy simple para verificar rápidamente que mi contenedor aún se construya y comience correctamente y que la aplicación en el interior responda a las solicitudes.
A veces, la docker run
falla, por ejemplo, porque el puerto al que intento vincular el contenedor ya está asignado. Pero cuando esto sucede, el código de salida de docker run
sigue siendo 0, por lo que no puedo usar el código de salida. ¿Cómo puedo verificar programáticamente que el contenedor se inició correctamente?
Las soluciones que estoy considerando son:
- analizar el resultado de errores
-
docker ps
para ver si el contenedor se está ejecutando
pero estos dos parecen un poco exagerados y feos. ¿Me está perdiendo una mejor manera de verificar si la docker run
?
Podríamos usar docker exec $id true 2>/dev/null || echo not running
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".
Según lo sugerido por Abel Muiño en los comentarios, esto puede haberse solucionado en las versiones más recientes de Docker (actualmente estoy ejecutando 0.9.1).
Pero, si estás atascado temporalmente como yo con una versión anterior, encontré una solución decente para verificar si el contenedor comenzó utilizando 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. El indicador -f
permite extraer fácilmente los bits necesarios:
docker inspect -f {{.State.Running}} $CONTAINER_ID
devolverá true
o false
.
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 la configuración, es posible que aparezca como "en funcionamiento" durante un tiempo muy corto antes de salir realmente.