Encuentra tu ID de contenedor detenido
docker ps -a
Confirmar el contenedor detenido:
Este comando guarda el estado del contenedor modificado en una nueva imagen user/test_image
docker commit $CONTAINER_ID user/test_image
Iniciar / ejecutar con un punto de entrada diferente:
docker run -ti --entrypoint=sh user/test_image
Descripción del argumento del punto de entrada: https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime
Nota:
Los pasos anteriores simplemente inician un contenedor detenido con el mismo estado del sistema de archivos. Eso es genial para una investigación rápida. Pero las variables de entorno, la configuración de red, los volúmenes adjuntos y otro personal no se heredan, debe especificar todos estos argumentos explícitamente.
Los pasos para iniciar un contenedor detenido se tomaron prestados desde aquí: (último comentario) https://github.com/docker/docker/issues/18078
inspect
salida en una configuración que se utiliza con la ejecución posterior?Edite este archivo (correspondiente a su contenedor detenido):
Cambie el parámetro "Ruta" para apuntar a su nuevo comando, por ejemplo / bin / bash. También puede establecer el parámetro "Args" para pasar argumentos al comando.
Reinicie el servicio acoplable (tenga en cuenta que esto detendrá todos los contenedores en ejecución):
Enumere sus contenedores y asegúrese de que el comando haya cambiado:
Inicie el contenedor y conéctelo, ¡ahora debería estar en su caparazón!
Trabajó en Fedora 22 usando Docker 1.7.1.
NOTA: Si su shell no es interactivo (por ejemplo, no creó el contenedor original con la opción -it), puede cambiar el comando a "/ bin / sleep 600" o "/ bin / tail -f / dev / null" para darle tiempo suficiente para hacer "docker exec -it CONTID / bin / bash" como otra forma de obtener un shell.
NOTA2: las versiones más recientes de docker tienen config.v2.json, donde deberá cambiar Entrypoint o Cmd (gracias user60561).
fuente
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, donde tendrá que cambiar cualquieraEntrypoint
oCmd
.Agregue un cheque en la parte superior de su script de Entrypoint
Docker realmente necesita implementar esto como una nueva característica, pero aquí hay otra opción alternativa para situaciones en las que tiene un Punto de entrada que finaliza después del éxito o el fracaso, lo que puede dificultar la depuración.
Si aún no tiene un script de Entrypoint, cree uno que ejecute los comandos que necesite para su contenedor. Luego, en la parte superior de este archivo, agregue estas líneas a
entrypoint.sh
:Para asegurarse de que se
cat
mantiene la conexión, es posible que deba proporcionar un TTY. Estoy ejecutando el contenedor con mi script de Entrypoint de esta manera:Esto hará que el script se ejecute una vez, creando un archivo que indica que ya se ha ejecutado (en el sistema de archivos virtual del contenedor). Luego puede reiniciar el contenedor para realizar la depuración:
Cuando reinicie el contenedor, se encontrará el
already_ran
archivo, lo que provocará que el script de Entrypoint se detengacat
(que solo espera para siempre la entrada que nunca llegará, pero mantiene vivo el contenedor). Luego puede ejecutar unabash
sesión de depuración :Mientras se ejecuta el contenedor, también puede eliminar
already_ran
y ejecutar manualmente elentrypoint.sh
script para volver a ejecutarlo, si necesita depurar de esa manera.fuente
/bin/sh
lugar decat
, luego siempre puede ingresar solo reiniciando. ¡Tu solución es genial!Mi problema:
docker run <IMAGE_NAME>
docker ps -a
pude ver dos contenedores.docker run <IMAGE_NAME>
comando, se creaba una nueva imagenSolución: para trabajar en el mismo contenedor que creó en primer lugar, siga estos pasos
docker ps
para obtener el contenedor de su contenedordocker container start <CONTAINER_ID>
para iniciar el contenedor existentedocker exec -it <CONTAINER_ID> /bin/bash
fuente
docker run <containerID>
Tomé la respuesta de @ Dmitriusan y la convertí en un alias:
Agregue esto a su
~/.bashrc
archivo de alias, y tendrá un nuevo e ingeniosodocker-run-prev-container
alias que lo colocará en un shell en el contenedor anterior.Útil para la depuración fallida
docker build
s.fuente
Esto no es exactamente lo que está pidiendo, pero puede usarlo
docker export
en un contenedor detenido si lo único que desea es inspeccionar los archivos.fuente
No se especificó si el contenedor está saliendo, solo que su código se bloquea y necesita ver lo que está sucediendo en el contenedor. Si no está saliendo, aquí hay otra solución potencial.
Obtenga la identificación del contenedor con
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Si el punto de entrada se establece en algo problemático, también se puede anular como se sugiere en la respuesta de Dmitriusan. También debe tenerse en cuenta que puede conectarse a cualquier contenedor en ejecución con
docker attach
. Tantas soluciones diferentes soluciones. Simplemente no veo la necesidad de comprometerme con la imagen. Parece innecesarioDocumentos para el ejecutivo de Docker: https://docs.docker.com/engine/reference/commandline/exec/
Documentos para Docker adjuntar: https://docs.docker.com/engine/reference/commandline/attach/
fuente
En realidad no estoy de acuerdo con ambas respuestas. Si solo quiere ver qué hay en el contenedor, puede ejecutar este comando para obtener un shell. No es necesario cambiar el punto de entrada en absoluto ni ninguna configuración.
fuente
docker logs <container_id> --follow
le dará lo que necesita. Otra alternativa es usar el comando anterior y luego iniciar el servicio de bloqueo en esa imagen con el mismo comando en el dockerfile y depurar desde allí.fuente