Es posible iniciar una sesión de shell en un contenedor (sin ssh)


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

Entonces, si quiero ejecutar bash shell en un contenedor en ejecución (ej. para fines de diagnóstico)

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

 293
Author: Cezar, 2013-07-28

14 answers

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

Anteriormente, la respuesta a esta pregunta era:

Si realmente debe 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 fuertemente en contra de esto.

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

 231
Author: creack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-06 14:37:25

Con docker 1.3, hay un nuevo comando docker exec. Esto le permite introducir una docker en ejecución:

docker exec -it "id of running container" bash
 581
Author: Michael_Scharf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 04:16:17

Solo hazlo

docker attach container_name

Como se mencionó en los comentarios, para separarse del contenedor sin detenerlo, escriba Ctrlpluego Ctrlq .

 12
Author: maxbellec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-07 10:37:46

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

Puedes encontrar más información sobre este repositorio 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 puedes usar el wrapper docker-enter:

docker-enter <container_name_or_ID>

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

 10
Author: Teudimundo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-20 07:23:37

Lo primero que no se puede ejecutar

docker run "existing container" command

Porque este comando está esperando una imagen y no un contenedor y de todos modos daría lugar a un nuevo contenedor que se genera (así que no el que quería ver)

Estoy de acuerdo con el hecho de que con docker debemos esforzarnos para pensar de una manera diferente (por lo que debe encontrar formas para que no tenga que iniciar sesión en el contenedor), pero todavía lo encuentro útil y así es como trabajo alrededor de él.

Corro mi comandos a través de supervisor en modo DEAMON.

Entonces ejecutaré lo que llamo docker_loop.sh El contenido es más o menos este:

#!/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 comprobar los registros. Si eso no es suficiente, puedes Ctrl+D y caerás en un shell que te permitirá echar un vistazo como si fuera un sistema normal.

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

 8
Author: Alessandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-05 10:21:04

Esté atento a esta solicitud de extracción: https://github.com/docker/docker/pull/7409

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 obtener ejecutar. https://gist.github.com/ubergarm/ed42ebbea293350c30a6

 4
Author: foz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 11:01:08

En realidad hay una manera de tener un shell en el contenedor.

Supongamos que su /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, tienes tus demonios en la pestaña 0, y un shell interactivo en la pestaña 1. docker attach en cualquier momento para ver lo que está sucediendo dentro del contenedor.

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

 1
Author: kolypto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-02 16:25:04

Aquí está mi solución

Parte del archivo 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 que se construye la imagen, tiene dos opciones usando exec y attach:

  1. con exec (que uso), ejecute:

Docker run name nameNAME CONTAINER_NAME-dt {IMAGE_NAME

Entonces

Docker exec-itNAME CONTAINER_NAME/bin / bash

Y use

CTRL + D para separar

  1. con adjuntar, ejecutar:

Docker ejecutar name nombre CONTAIN CONTAINER_NAME-dit {IMAGE_NAME

Entonces

Docker attach {CONTAINER_NAME

Y use

CTRL + P y CTRL + Q para separar

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

 1
Author: tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-26 09:36:07

Hay dos maneras.

Con adjuntar

$ sudo docker attach 665b4a1e17b6 #by ID

Con exec

$ sudo docker exec - -t 665b4a1e17b6 #by ID
 1
Author: gurubelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-29 18:41:29

Puede usar

docker exec -it <container_name> bash
 1
Author: antikytheraton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 18:34:39

Si el objetivo es comprobar los registros de la aplicación, este post muestra iniciar tomcat y seguir el registro como parte de CMD. El registro de tomcat está disponible en el host usando 'docker logs containerid'.

Http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/

 0
Author: Mark K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-01 16:41:38

Es útil asignar nombre cuando se ejecuta el contenedor. No necesitas referir container_id.

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

 0
Author: Matsumoto Kazuya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 07:42:52

Tal vez usted fue engañado como yo pensando 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 "adjuntar" a ellos para fines de depuración (piense en /proc//env o strace-p), pero ese es un caso muy especial.

Normalmente solo "ejecuta" el proceso, por lo 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 él por compartir directorios, escribir en stdout (para que docker logs funcione) o algo así.

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

docker attach <container_id>

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

 -2
Author: estani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:13:41

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

 -4
Author: Nick Stinemates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-28 18:48:51