tag run remove iniciar imagenes hub example contenedor compose docker

run - ¿Cómo iniciar un contenedor Docker detenido con un comando diferente?



imagenes docker (9)

Me gustaría iniciar un contenedor Docker detenido con un comando diferente, ya que el comando predeterminado se bloquea, lo que significa que no puedo iniciar el contenedor y luego usar ''docker exec''.

Básicamente me gustaría comenzar un shell para poder inspeccionar el contenido del contenedor.

¡Por suerte creé el contenedor con la opción -it!


Agregue una marca de verificación 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 de solución 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 cualquier comando que necesite para su contenedor. Luego, en la parte superior de este archivo, agregue estas líneas a entrypoint.sh :

# Run once, hold otherwise if [ -f "already_ran" ]; then echo "Already ran the Entrypoint once. Holding indefinitely for debugging." cat fi touch already_ran # Do your main things down here

Para asegurarse de que el cat mantenga la conexión, es posible que deba proporcionar un TTY. Estoy ejecutando el contenedor con mi script de Entrypoint así:

docker run -t --entrypoint entrypoint.sh image_name

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:

docker start container_name

Cuando reinicia el contenedor, se encontrará el archivo already_ran , lo que hace que el script Entrypoint se detenga con cat (que solo espera para siempre la entrada que nunca llegará, pero mantiene vivo el contenedor). Luego puede ejecutar una sesión bash depuración:

docker exec -i container_name bash

Mientras el contenedor se está ejecutando, también puede eliminar already_ran y ejecutar manualmente el script entrypoint.sh para volver a ejecutarlo, si necesita depurar de esa manera.


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 de 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


De hecho, no estoy de acuerdo con estas dos 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.

docker container start <CONTAINER_ID>


Edite este archivo (correspondiente a su contenedor detenido):

vi /var/lib/docker/containers/923...4f6/config.json

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):

service docker restart

Enumere sus contenedores y asegúrese de que el comando haya cambiado:

docker ps -a

Inicie el contenedor y conéctelo, ¡ahora debería estar en su caparazón!

docker start -ai mad_brattain

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.

NOTA 2: las versiones más recientes de docker tienen config.v2.json, donde deberá cambiar Entrypoint o Cmd (gracias user60561).


Esto no es exactamente lo que está pidiendo, pero puede usar la docker export en un contenedor detenido si todo lo que desea es inspeccionar los archivos.

mkdir $TARGET_DIR docker export $CONTAINER_ID | tar -x -C $TARGET_DIR


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 adjuntar a cualquier contenedor en ejecución con docker attach . Tantas soluciones diferentes soluciones. Simplemente no veo la necesidad de comprometerme con la imagen. Parece innecesario

Documentos 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/


Tomé la respuesta de @ Dmitriusan y la convertí en un alias:

alias docker-run-prev-container = ''prev_container_id = "$ (docker ps -aq | head -n1)" && docker commit "$ prev_container_id" "prev_container / $ prev_container_id" && docker run -it --entrypoint = bash "prev_container" / $ prev_container_id "''

Agregue esto a su archivo de alias ~/.bashrc , y tendrá un nuevo e ingenioso alias docker-run-prev-container colocará en un shell en el contenedor anterior.

Útil para depurar las docker build fallidas.


Mi problema:

  • Comencé un contenedor con docker run <IMAGE_NAME>
  • Y luego agregó algunos archivos a este contenedor
  • Luego cerré el contenedor e intenté iniciarlo nuevamente con el mismo comando que el anterior.
  • Pero cuando revisé los nuevos archivos, faltaban
  • cuando ejecuto docker ps -a pude ver dos contenedores.
  • Eso significa que cada vez que estaba ejecutando docker run <IMAGE_NAME> comando docker run <IMAGE_NAME> , se creaba una nueva imagen

Solución: para trabajar en el mismo contenedor que creó en primer lugar, siga estos pasos

  • docker ps para obtener el contenedor de su contenedor
  • docker container start <CONTAINER_ID> para iniciar el contenedor existente
  • Entonces puedes continuar desde donde te fuiste. por ejemplo, docker exec -it <CONTAINER_ID> /bin/bash
  • Luego puede decidir crear una nueva imagen a partir de ella

docker run -it <image_name> bash