Manera correcta de separarse de un contenedor sin detenerlo

313

En Docker 1.1.2 (más reciente), ¿cuál es la forma correcta de separarse de un contenedor sin detenerlo?

Entonces, por ejemplo, si lo intento:

  • docker run -i -t foo /bin/bash o
  • docker attach foo (para el contenedor que ya se está ejecutando)

ambos me llevan a una terminal en el contenedor, ¿cómo salgo de la terminal del contenedor sin detenerlo?

exity CTR+Cambos detienen el contenedor.

mtmacdonald
fuente
El "contenedor" es solo un conjunto de espacios de nombres restringidos (un espacio de nombres de proceso, un espacio de nombres de sistema de archivos, etc.) en los que pueden ejecutarse los procesos. Si no tiene ningún proceso dentro de un espacio de nombres, ¿existe realmente ese espacio de nombres? No es como una máquina virtual donde hay un kernel que contesta interrupciones del reloj, etc. independientemente.
Charles Duffy

Respuestas:

166

Actualización: Como se menciona en las respuestas por debajo de Ctrl+ p, Ctrl+ qpasará ahora a modo interactivo en modo demonio.


Bueno, Ctrl+ C(o Ctrl+ \) debería separarte del contenedor, pero matará al contenedor porque tu proceso principal es un golpe.

Una pequeña lección sobre docker. El contenedor no es un sistema operativo real completo. Cuando ejecuta un contenedor, el proceso que inicia toma el PID 1 y asume el poder de inicio. Entonces, cuando ese proceso finaliza, el demonio detiene el contenedor hasta que se inicia un nuevo proceso (a través de Docker Start) (Más explicación al respecto http://phusion.github.io/baseimage-docker/#intro )

Si desea un contenedor que se ejecute en modo separado todo el tiempo, le sugiero que use

docker run -d foo

Con un servidor ssh en el contenedor. (La forma más fácil es seguir el tutorial dockerizing openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

O simplemente puede relanzar su contenedor a través de

docker start foo

(se separará de forma predeterminada)

Regan
fuente
3
+1 para baseimage-docker. Es genial saber que hay una plantilla con consejos sobre las partes difíciles de Docker.
mtmacdonald
Tenga en cuenta que ssh no es estrictamente necesario: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat
1
Ejecutar un contenido en modo -d fue muy útil. Además, el enlace para iniciar ssh a través de Dockerfile me facilitó la vida.
Ravi
56
Separar usando Ctrl-p, Ctrl-q. El consejo de esta respuesta matará un contenedor.
taranaki
44
Esto funcionó para mí (tomado de la respuesta a continuación): Comience con -ti -d, luego adjunte con docker attach, luego separe con primero ctrl + p y luego ctrl + q. Pensé que podría usar solo uno de los atajos de teclado.
CGFoX
526

Escriba Ctrl+ pluego Ctrl+ q. Le ayudará a cambiar el modo interactivo al modo demonio.

Ver https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell .

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")
Larry Cai
fuente
44
Parece que no funciona con (tratando de salir de un contenedor Wekan adjunto).
danger89
77
He visitado esta página muchas veces porque no podía recordar esta combinación de teclas con precisión. :-D
Thamme Gowda
10
@ danger89 ctrl-p, ctrl-q solo funcionará cuando haya iniciado su contenedor con el modo interactivo (-it). Si lo ha iniciado en modo deamon (-d) y lo ha adjuntado, puede salir de él y seguirá ejecutándose en segundo plano.
Riscie
1
@SlimShady presione Ctrl + P y luego Ctrl + Q para salir, no uno de ellos, sino ambos en ese orden.
Mohyaddin Alaoddin
160

Me enteré de esto y todas las respuestas anteriores son parcialmente correctas. Todo depende de cómo se inicie el contenedor. Todo se reduce a lo siguiente cuando se lanzó el contenedor:

  • se asignó un TTY ( -t)
  • se dejó stdin abierto ( -i)

^P^Q funciona, PERO solo cuando -ty -ise utiliza para iniciar el contenedor:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c funciona, PERO solo cuando -t( sin -i ) se utiliza para iniciar el contenedor:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

La tercera forma de desprenderse

Sin embargo, hay una manera de separarse sin matar el contenedor; Necesitas otro caparazón. En resumen, ejecutar esto en otro shell separado y dejar el contenedor ejecutándose pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

¿Por qué? Porque estás matando el proceso que te conectó al contenedor, no al contenedor en sí.

berto
fuente
2
La tercera forma me funciona. Gracias. si está adjuntando a varias instancias y solo desea desconectarse de una. Puede matar el proceso específico: ps -ef | grep attach -> get pid. Entonces: kill -9 <pid>
phanhuy152
pkill es el único que trabajó para mí después de estibador adjuntar
sm4rk0
¿Por qué necesitamos el -9? Me di cuenta de que si no usamos el -9 se cierra el contenedor.
Angelo
Otras señales son eso, señales. Le dicen al proceso qué tipo de señal y le dan la oportunidad de actuar y hacer algo. La kill -9señal no lo hace. El proceso finaliza y no tiene recurso. Supongo que otras señales le dan al contenedor la oportunidad de apagarse, mientras -9que no.
berto
1
Esto fue súper útil. ¡Gracias!
Evan Zamir
40

Si hace "docker attach" id. De contenedor ", ingresa al contenedor. Para salir del contenedor sin detener el contenedor, debe ingresar Ctrl+ P+Q

Ashwin
fuente
66
mejor que Ctrl + P y Ctrl + Q
sib10
44
Ctrl + P, Q (aún manteniendo Ctrl);)
dimpiax
me devuelve:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman
31

Considero que la respuesta de Ashwin es la más correcta, mi respuesta anterior está a continuación.


Me gustaría agregar otra opción aquí que es ejecutar el contenedor de la siguiente manera

docker run -dti foo bash

Luego puede ingresar al contenedor y ejecutar bash con

docker exec -ti ID_of_foo bash

No es necesario instalar sshd :)

PiersyP
fuente
Creo que en el segundo comando debes reemplazar foo con el id de contenedor de foo
Nehal J Wani
En este contexto, creo docker attachque sería más estándar, al volver a conectar a la primera ejecución de bash. docker execTambién funciona aquí, sin embargo, crea un nuevo proceso de bash además del primero. Claro, el proceso se crea dentro del mismo contexto / entorno / contenedor del primero, sin embargo, es diferente (una analogía sería abrir una nueva pestaña de terminal en su emulador de terminal favorito).
thiagowfx
20

La forma predeterminada de desconectarse de un contenedor interactivo es Ctrl+ P Ctrl+ Q, pero puede anularlo cuando ejecuta un nuevo contenedor o se conecta a un contenedor existente utilizando el indicador --detach-keys .

férula
fuente
17

Si lo adjuntaste docker attach, puedes separarlo eliminando el proceso de conexión de la ventana acoplable. La mejor manera es usar el parámetro sig-proxy para evitar pasar Ctrl + C a su contenedor:

docker attach --sig-proxy=false [container-name]

La misma opción está disponible para el docker runcomando.

Alexis LEGROS
fuente
66
Aunque --sig-proxy = false es extremadamente útil, no funciona para contenedores ya conectados para los que no se especificó. El problema es que, después de la conexión, parece que NO hay forma de desconectarse sin matar el proceso, incluido "matar el proceso de conexión del acoplador". Cp, Cq no funciona con contenedores adjuntos, solo interactivos (como los que usa la pregunta).
taranaki
1
Esta debería ser la respuesta aceptada, incluido el comentario de @taranaki, Ctrl + P, Q no funcionaphp:7.3-apache
MKaama
10

Si solo desea ver la salida del proceso que se ejecuta desde el contenedor, puede hacer una simple docker container logs -f <container id>.

La -fbandera hace que la salida del contenedor se followedactualice en tiempo real. Muy útil para depurar o monitorear.

agupta231
fuente
8

Puede usar la --detach-keysopción cuando ejecuta docker attachpara anular la secuencia CTRL+ P, CTRL+ predeterminada Q(que no siempre funciona).

Por ejemplo, cuando corres docker attach --detach-keys="ctrl-a" testy presionas CTRL+ Asaldrás del contenedor, sin matarlo.

Otros ejemplos:

  • docker attach --detach-keys="ctrl-a,x" test- presione CTRL+Ay luego Xpara salir
  • docker attach --detach-keys="a,b,c" test- presione A, luego B, luego Cpara salir

Extracto de la documentación oficial:

Si lo desea, puede configurar una anulación de la secuencia de teclas Docker para la separación. Esto es útil si la secuencia predeterminada de Docker entra en conflicto con la secuencia de teclas que usa para otras aplicaciones. Hay dos formas de definir su propia secuencia de teclas de separación, como una anulación por contenedor o como una propiedad de configuración en toda su configuración.

Para anular la secuencia de un contenedor individual, use la --detach-keys="<sequence>"bandera con el comando docker attach. El formato del <sequence>o es una letra [a-Z], o se ctrl-combina con cualquiera de los siguientes:

  • az (un solo carácter alfabético en minúsculas)
  • @ (a la señal)
  • [(soporte izquierdo)
  • \ (dos barras hacia atrás)
  • _ (guion bajo)
  • ^ (cuidado)

Estos a, ctrl-a, X, o ctrl-\\valores son todos ejemplos de secuencias de teclas válidos. Para configurar una secuencia de teclas predeterminada de configuración diferente para todos los contenedores, consulte la sección Archivo de configuración .

Nota: Esto funciona desde la versión Docker 1.10+ (en el momento de esta respuesta, la versión actual es 18.03)

Constantin Galbenu
fuente
0

Publicación anterior pero solo salga y luego comience de nuevo ... el problema es si está en una máquina con Windows Ctrl p o Ctrl P están atados para imprimir ... salir del inicio del contenedor no debería dañar nada

tmac
fuente