A veces hay que investigar un contenedor, que se detiene, o un contenedor que después de arrancar muere muy rápido y se detiene.
docker exec -ti <id> bash
solo funciona en contenedores en ejecución, una vez que finaliza, el indicador de bash también finaliza.
Con docker start
usted no puede proporcionar un comando diferente, y si el contenedor vuelve a morir abruptamente, no tendrá tiempo suficiente para entrar en el contenedor e investigar.
Podemos hacerlo docker commit
, luego docker run
en la nueva imagen con un comando diferente, pero me pregunto si hay otras alternativas.
Nota : docker logs
solo devuelve las aplicaciones impresas en stdout / stderr. Eso podría no ser suficiente para descubrir cuál era el problema.
docker
containers
post-mortem
SztupY
fuente
fuente
Respuestas:
Las formas generales de rastrear por qué falló un proceso en Linux son buenas. Una de estas formas es ejecutar un proceso
strace
que le dirá qué hizo el proceso de llamadas del sistema y, por lo general, le indicará el motivo de la falla.Puede crear una
Dockerfile
que se vea así:Luego ejecuta tu nueva imagen usando
docker run debug_version strace original_cmd
.Para los procesos que bifurcan a los hijos (y luego mueren) que desea ejecutar
strace
con la-ff
opción. También puede asignar algún archivo utilizando los volúmenes de datos de Docker y usar la-o
opción destrace
para escribir en él. Pero en generalstrace
dejará la salida en stdout, que se puede leer usandodocker log
.P relacionada : el proceso de Linux termina misteriosamente
fuente
docker commit
mi contenedor detenido primero en tener una imagen a partir destrace
Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Utilice el gestor de paquetes Alpine para instalarlo,apk install strace
.Hasta donde yo sé,
commit
yrun
son las mejores opciones aquí para darle acceso completo al contenedor como estaba cuando murió.Idealmente, su contenedor escupiría información más útil cuando falla, pero ese es otro tema completamente diferente.
Editar: para expandir mi respuesta, si el contenedor se está muriendo en el inicio, también puede usar
docker run
para especificar una alternativa--entrypoint
yCMD
. En general, configuraré esto en un bucle o algo que no salga solo. Una vez que esté en el contenedor, puede ejecutar manualmente los pasos que están fallando y luego inspeccionar el resultado sin tener que preocuparse por la salida del contenedor.fuente