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 ?
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.
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
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 .
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
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.
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
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.
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:
- 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
- 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
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
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
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/
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
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
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.
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