run images hub dockers container docker

docker - images - ¿Es posible iniciar una sesión de shell en un contenedor en ejecución(sin ssh)



download docker image (14)

Con docker 1.3, hay un nuevo comando doc . Esto le permite ingresar a una ventana acoplable en ejecución:

docker exec -it "id of running container" bash

Esperaba ingenuamente que este comando ejecutara un shell bash en un contenedor en ejecución:

docker run "id of running container" /bin/bash

Parece que no es posible, me sale el error:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

Por lo tanto, si quiero ejecutar bash shell en un contenedor en ejecución (por ejemplo, para fines de diagnóstico)

¿Tengo que ejecutar un servidor SSH en él y registrarse a través de ssh?


Dado que las cosas están cambiando, en este momento la forma recomendada de acceder a un contenedor en ejecución es usar nsenter .

Puedes encontrar más información en este repositorio de github . Pero en general puedes usar nsenter así:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) nsenter --target $PID --mount --uts --ipc --net --pid

o puede utilizar la ventana docker-enter contenedor docker-enter :

docker-enter <container_name_or_ID>

Puede encontrar una buena explicación sobre el tema en la entrada del blog de Jérôme Petazzoni: ¿Por qué no necesita ejecutar sshd en sus contenedores docker?


EDITAR: Ahora puede usar el docker exec -it "id of running container" bash ( doc )

Anteriormente, la respuesta a esta pregunta era:

Si realmente debe hacerlo y está en un entorno de depuración, puede hacer esto: sudo lxc-attach -n <ID> Tenga en cuenta que el ID debe ser el completo ( docker ps -notrunc ).

Sin embargo, recomiendo encarecidamente en contra de esto.

aviso: -notrunc está en desuso, será reemplazado por --no-trunc pronto.


En realidad, hay una manera de tener una concha en el contenedor.

Supongamos que /root/run.sh inicia el proceso, el administrador de procesos (supervisor) o lo que sea.

Crea /root/runme.sh con algunos trucos de gnu-screen:

# Spawn a screen with two tabs screen -AdmS ''main'' /root/run.sh screen -S ''main'' -X screen bash -l screen -r ''main''

Ahora, tiene sus demonios en la pestaña 0 y un shell interactivo en la pestaña 1. docker attach en cualquier momento para ver qué sucede dentro del contenedor.

Otro consejo es crear una imagen de "paquete de desarrollo" sobre la imagen de producción con todas las herramientas necesarias, incluido este truco de pantalla.


Es útil asignar nombre al ejecutar contenedor. No necesitas referir container_id.

docker run --name container_name yourimage docker exec -it container_name bash


Hay dos maneras.

Con adjuntar

$ sudo docker attach 665b4a1e17b6 #by ID

Con exec

$ sudo docker exec - -t 665b4a1e17b6 #by ID


Lo primero que no puedes correr.

docker run "existing container" command

Debido a que este comando está esperando una imagen y no un contenedor y, de todos modos, se generaría un nuevo contenedor (por lo tanto, no el que quería ver)

Estoy de acuerdo con el hecho de que con Docker deberíamos esforzarnos para pensar de una manera diferente (por lo que deberías encontrar formas para que no tengas que iniciar sesión en el contenedor), pero todavía me resulta útil y así es como trabajo. alrededor.

Ejecuto mis comandos a través de supervisor en modo DEAMON.

Luego ejecuto lo que llamo docker_loop.sh El contenido es más o menos esto:

#!/bin/bash /usr/bin/supervisord /usr/bin/supervisorctl while ( true ) do echo "Detach with Ctrl-p Ctrl-q. Dropping to shell" sleep 1 /bin/bash done

Lo que hace es que le permite "adjuntar" al contenedor y ser presentado con la interfaz supervisorctl para detener / iniciar / reiniciar y revisar los registros. Si eso no es suficiente, puede Ctrl+D y caer en un shell que le permitirá echar un vistazo alrededor como si fuera un sistema normal.

POR FAVOR, TOME EN CUENTA QUE este sistema no es tan seguro como tener el contenedor sin cáscara, así que tome todas las medidas necesarias para asegurar su contenedor.


Mantenga un ojo en esta solicitud de extracción: https://github.com/docker/docker/pull/7409

Lo que implementa la próxima utilidad docker exec <container_id> <command> . Cuando esté disponible, debería ser posible, por ejemplo, iniciar y detener el servicio ssh dentro de un contenedor en ejecución.

También hay nsinit para hacer esto: "nsinit proporciona una forma práctica de acceder a un shell dentro del espacio de nombres de un contenedor en ejecución" , pero parece difícil de ejecutar. https://gist.github.com/ubergarm/ed42ebbea293350c30a6


No. Esto no es posible. Use algo como supervisord para obtener un servidor ssh si es necesario. Aunque, definitivamente cuestiono la necesidad.


Puedes usar

docker exec -it <container_name> bash



Solo haz

docker attach container_name

Como se mencionó en los comentarios, para separar del contenedor sin detenerlo, escriba Ctrl p y luego Ctrl q .


Tal vez se engañó como yo para pensar en términos de máquinas virtuales al desarrollar contenedores. Mi consejo: trata de no hacerlo.

Los contenedores son como cualquier otro proceso. De hecho, es posible que desee "adjuntarlos" con fines de depuración (piense en / proc // env o strace -p) pero ese es un caso muy especial.

Normalmente, simplemente "ejecuta" el proceso, así que si desea modificar la configuración o leer los registros, simplemente cree un nuevo contenedor y asegúrese de escribir los registros fuera de ellos compartiendo directorios, escribiendo en stdout (para que funcionen los registros de la ventana acoplable) o algo así.

Para propósitos de depuración, es posible que desee iniciar un shell, luego su código, luego presione CTRL-p + CTRL-q para dejar intacto el shell. De esta manera puedes volver a unir usando:

docker attach <container_id>

Si desea depurar el contenedor porque está haciendo algo que no esperaba que hiciera, intente depurarlo: https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container-initialization


aquí está mi solución

parte de DOckerfile:

... RUN mkdir -p /opt ADD initd.sh /opt/ RUN chmod +x /opt/initd.sh ENTRYPOINT ["/opt/initd.sh"]

parte de "initd.sh"

#!/bin/bash ... /etc/init.d/gearman-job-server start /etc/init.d/supervisor start #very important!!! /bin/bash

después de crear la imagen, tiene dos opciones utilizando exec y adjuntar:

  1. con exec (que yo uso), ejecute:

ventana acoplable ejecutada - nombre $ CONTAINER_NAME -dt $ IMAGE_NAME

entonces

docker exec -it $ CONTAINER_NAME / bin / bash

y use

CTRL + D para separar

  1. con adjuntar, ejecutar:

ventana acoplable ejecutada - nombre $ CONTAINER_NAME -dit $ IMAGE_NAME

entonces

ventana acoplable adjuntar $ CONTAINER_NAME

y use

CTRL + P y CTRL + Q para separar

La diferencia entre las opciones está en el parámetro -i.