Ingenuamente esperaba 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 (por ejemplo, para fines de diagnóstico)
¿Tengo que ejecutar un servidor SSH en él e iniciar sesión a través de ssh?
docker run CONTAINER
está previsto en 1.0docker attach container_name
Respuestas:
EDITAR: ahora puedes usar
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 la identificación debe ser completa (docker ps -notrunc
).Sin embargo, lo recomiendo en contra de esto.
aviso:
-notrunc
está en desuso, será reemplazado por--no-trunc
pronto.fuente
lxc-attach
debería funcionar bien. Acabo de duplicar la comprobación y funciona para mí. (Tenga en cuenta que no funcionará con el núcleo antes de 3.8).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) ejecutar otro recipiente para ver el contenido de volumen de datos:docker run -volumes-from somename -i -t busybox /bin/sh
.Con docker 1.3, hay un nuevo comando
docker exec
. Esto le permite ingresar a una ventana acoplable en ejecución:fuente
docker ps
para conseguir Identificación de instancias corriendodocker inspect <image>
para ver qué shell está disponible. Ejdocker exec -it <container id> /bin/sh
. Correr en su lugar.Solo haz
Como se mencionó en los comentarios, para separarlo del contenedor sin detenerlo, escriba Ctrlpentonces Ctrlq.
fuente
docker attach container_name
usectrl p
y enctrl q
lugar deexit
.exit
el comando detiene el contenedor, donde comoctrlp
yctrl q
solo separa ese contenedor y lo mantiene en funcionamientoComo las cosas están cambiando, en este momento está utilizando la forma recomendada de acceder a un contenedor en ejecución
nsenter
.Puede encontrar más información sobre este repositorio de github . Pero, en general, puede usar nsenter de esta manera:
o puedes usar el envoltorio
docker-enter
: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 los contenedores de la ventana acoplable?
fuente
source /proc/*/environ
.Lo primero que no puedes correr
Debido a que este comando espera una imagen y no un contenedor , de todos modos se generaría un nuevo contenedor (por lo tanto, no el que desea 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 necesite iniciar sesión en el contenedor), pero todavía lo encuentro útil y así es como trabajo alrededor.
Ejecuto mis comandos a través del supervisor en modo DEAMON.
Luego ejecuto lo que llamo
docker_loop.sh
El contenido es más o menos esto:Lo que hace es que le permite "adjuntar" al contenedor y se le presentará la
supervisorctl
interfaz para detener / iniciar / reiniciar y verificar los registros. Si eso no fuera suficiente, puedesCtrl+D
y caerás en un caparazón que te permitirá echar un vistazo como si fuera un sistema normal.TENGA EN CUENTA TAMBIÉN que este sistema no es tan seguro como tener el contenedor sin carcasa, así que tome todas las medidas necesarias para asegurar su contenedor.
fuente
Esté atento a esta solicitud de extracción: https://github.com/docker/docker/pull/7409
Que implementa la próxima
docker exec <container_id> <command>
utilidad. 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
que 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/ed42ebbea293350c30a6fuente
docker exec
aterrizó en Docker 1.3, por lo que ahora es posible crear y unirse a una nueva sesión de shell en un contenedor en ejecuciónPuedes usar
fuente
En realidad, hay una manera de tener un caparazón en el contenedor.
Suponga 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: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" encima de la imagen de producción con todas las herramientas necesarias, incluido este truco de pantalla.
fuente
aqui esta mi solucion
parte de DOckerfile:
parte de "initd.sh"
después de construir la imagen, tiene dos opciones usando exec y adjuntar:
docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME
entonces
docker exec -it $ CONTAINER_NAME / bin / bash
y use
CTRL + D para separar
docker run --name $ CONTAINER_NAME -dit $ IMAGE_NAME
entonces
ventana acoplable $ CONTAINER_NAME
y use
CTRL + P y CTRL + Q para separar
la diferencia entre las opciones está en el parámetro -i
fuente
Hay dos maneras.
Con adjuntar
Con el ejecutivo
fuente
Si el objetivo es verificar los registros de la aplicación, esta publicación muestra cómo iniciar tomcat y seguir el registro como parte de CMD. El registro de Tomcat está disponible en el host mediante 'docker logs containerid'.
http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/
fuente
Es útil asignar nombre cuando se ejecuta el contenedor. No necesita referir container_id.
docker run --name container_name yourimage docker exec -it container_name bash
fuente
primero, obtenga la identificación del contenedor deseado
obtendrás algo como esto:
ahora copie esta ID de contenedor y ejecute el siguiente comando:
fuente
Tal vez te engañaste como yo a pensar en términos de máquinas virtuales al desarrollar contenedores. Mi consejo: intenta no hacerlo.
Los contenedores son como cualquier otro proceso. De hecho, es posible que desee "adjuntar" a ellos con fines de depuración (piense en / proc // env o strace -p) pero ese es un caso muy especial.
Normalmente, simplemente "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 compartiendo directorios, escribiendo en stdout (para que los registros de Docker funcionen) 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, puede volver a conectar usando:
Si desea depurar el contenedor porque está haciendo algo que no esperaba que hiciera, intente depurarlo: /server/596994/how-can-i-debug-a-docker-container -inicialización
fuente
No. Esto no es posible. Use algo como
supervisord
obtener un servidor ssh si es necesario. Aunque, definitivamente cuestiono la necesidad.fuente