¿Cómo se conecta y desconecta del proceso de Docker?

459

Puedo adjuntarme a un proceso de acoplador pero Ctrl+ cno funciona para desconectarlo. exitbásicamente detiene el proceso.

¿Cuál es el flujo de trabajo recomendado para ejecutar el proceso, adjuntándolo ocasionalmente para realizar algunos cambios y luego separándolo?

MarkL
fuente
44
Cuando uso nsenter, solo hago Ctrl-D.
user2105103
¿Funciona el cierre xterm, konsoleetc.? Funciona para mí (me despido).
Vytenis Bivainis

Respuestas:

668

Para separar el tty sin salir del shell, use la secuencia de escape Ctrl+ Pseguido de Ctrl+ Q. Más detalles aquí .

Información adicional de esta fuente :

  • Docker Run -t -i → se puede separar ^P^Qy volver a conectar con Docker Attach
  • docker run -i → no se puede separar con ^P^Q; interrumpirá stdin
  • docker run → no se puede separar con ^P^Q; puede SIGKILL cliente; se puede volver a colocar con acoplador acoplable
Ken Cochrane
fuente
46
Esta sería una gran respuesta si realmente funcionara como se describe en los documentos.
allingeek
20
Descubrí que incluso cuando se ejecuta con -it, la secuencia de desconexión falla si también inicia el contenedor con el indicador de limpieza (--rm). Esto puede ser obvio para algunos, pero me muerde más de lo que me gustaría admitir.
allingeek
77
Otra opción es simplemente cerrar la ventana de su terminal o cmd-w :)
buildmaestro
3
Puede configurar las teclas configurables con desasociación por ejemplo, "detachKeys": "ctrl-a,a"en el archivo de .docker / config.json o --detach-keys "ctrl-a,a"en la línea de comandos con adjuntar etc.
Mateo Hannigan
44
Ctrl + Zno se separa; solo da origen al proceso. No es lo mismo que separarse y conlleva una penalización de rendimiento.
Zenexer
178

Mira también la --sig-proxyopción :

docker attach --sig-proxy=false 304f5db405ec

Luego use CTRL+ cpara separar

czerasz
fuente
44
Para probar esto comenzando con ejecutar en lugar de adjuntar, intenté: lo docker run -ti --sig-proxy=false busybox top que parece no funcionar, el proceso se elimina con ctrl-c pero al comenzar docker run -t -sig-proxy=false busybox top parece funcionar y permitir salir con ctrl-c
Henning
Ctrl-cdetendrá el contenedor también.
Evan Hu
Es la única solución de las enumeradas aquí que funciona para mí en el servidor Debian 9 con Docker 19.03.5. La pregunta es, ¿por qué no es esta la configuración predeterminada para adjuntar comandos? Parece ser el caso de uso más común.
fviktor
La secuencia Ctrl-p, Ctrl-q no funciona para mí (comenzó como contenedor acoplable adjuntar xyz) ... pero esto sí. Gracias @czerasz
PravyNandas
92

Si solo desea realizar alguna modificación en los archivos o inspeccionar los procesos, esta es otra solución que probablemente desee.

Puede ejecutar el siguiente comando para ejecutar un nuevo proceso desde el contenedor existente:

sudo docker exec -ti [CONTAINER-ID] bash

iniciará un nuevo proceso con bash shell, y podría escapar de él directamente Ctrl+ C, no afectará el proceso original.

Colin Su
fuente
66
Esto funcionó, puede escribir "salir" una vez que haya terminado sin afectar el proceso original.
Eko3alpha
Esta es una excelente manera de conectarse a un contenedor en ejecución. Pero, ¿qué sucede si (por ejemplo) tengo algún proceso ejecutándose en el contenedor y quiero reiniciar ese proceso? Ah, puedo matar el proceso anterior, reiniciar el nuevo y usar Cp, Cq, que funciona ya que es un tty interactivo. También me gusta el método --sig-proxy = false, pero es más versátil y no fuerza la interrupción del proceso actual.
taranaki
"adjuntar" tiene un significado específico con Docker, y execno lo es.
viernes
48

Creo que esto debería depender de la situación. Tome el siguiente contenedor como ejemplo:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) Use " docker attach" para adjuntar el contenedor:

Como " docker attach" no asignará un nuevo tty, sino que reutilizará el tty original en ejecución, por lo que si ejecuta el exitcomando, provocará la salida del contenedor en ejecución:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

Entonces, a menos que realmente quiera hacer que la salida del contenedor se ejecute, debe usar Ctrl+ p+ Ctrl+ q.

(2) Use " docker exec"

Dado que " docker exec" se asignará un nuevo TTY, así que creo que se debe utilizar exiten lugar de Ctrl+ p+ Ctrl+ q.

Lo siguiente es ejecutar Ctrl+ p+ Ctrl+ qpara salir del contenedor:

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

Luego, vuelva a iniciar sesión en el contenedor, verá que el bashproceso en el docker execcomando anterior todavía está vivo (PID es 15):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29
Nan Xiao
fuente
39

Para desconectarse de un contenedor en funcionamiento, use ^P^Q(sostenga Ctrl, presione P, presione Q, suelteCtrl ).

Hay un inconveniente: esto solo funciona si el contenedor se inició con ambos -t y-i .

Si tiene un contenedor en ejecución que se inició sin una (o ambas) de estas opciones, y se conecta con docker attachél, necesitará encontrar otra forma de desconectarse. Dependiendo de las opciones que elija y del programa que se esté ejecutando, ^Cpuede funcionar o puede matar todo el contenedor. Tendrás que experimentar.

Otro inconveniente: Dependiendo de los programas que esté utilizando, su terminal, shell, cliente SSH o multiplexor podrían estar interceptando uno ^Pu otro ^Q(generalmente el último). Para probar si este es el problema, intente ejecutar o adjuntar con el --detach-keys zargumento. Ahora debería poder desconectarse presionando z, sin ningún modificador. Si esto funciona, otro programa está interfiriendo. La forma más fácil de evitar esto es establecer su propia secuencia de separación utilizando el --detach-keysargumento. (Por ejemplo, para salir ^K, use --detach-keys 'ctrl-k'). Alternativamente, puede intentar deshabilitar la intercepción de las teclas en su terminal u otro programa que interfiera. Por ejemplo, stty start ''o stty start undefpuede evitar que el terminal intercepte^Q en algunos sistemas POSIX, aunque no he encontrado que esto sea útil.

Zenexer
fuente
2
Explicación súper precisa, funcionó a las
mil maravillas
27

cuando nada más funciona, abra una nueva terminal y luego:

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>
Adi Fatol
fuente
¡Qué trampa! Gracias, esto es lo único que funcionó. -9No fue necesario.
Heath Raftery
Esto también mata el contenedor, quizás dependiendo de qué banderas se establecieron.
AdamAL
1
Tenga en cuenta que si se muestran dos pids , el primero es el padre. Deberías usar el segundo pid para matar docker attachy no su padre.
joeytwiddle
11

Para separarse del contenedor, simplemente sostenga Ctrly presione P+Q .

Para adjuntar a un contenedor en ejecución que utiliza:

$ docker container attach "container_name"
gXg
fuente
9

Yo tenía el mismo problema, ctrl- Py Qno funcionaría, ni ctrl- C... con el tiempo abrí otra sesión de terminal y lo hice "ventana acoplable parada ContainerId " y "ventana acoplable inicio ContainerId " y se hizo el trabajo. Extraño.

Pierluigi Vernetto
fuente
Esto no funcionará si inició el contenedor con --rmbandera. Ctrl+Py Ctrl+Qfunciona si comenzó el contenedor con -itbandera.
Aswath K
4

En el mismo caparazón, mantenga presionada la ctrltecla y presione las teclas pluegoq

ravthiru
fuente
3
Esto solo funciona si inició el contenedor con -itbandera.
Aswath K
2

Estoy en un Mac, y por alguna razón, Ctrl- p Ctrl- qsólo funcionaría si también sostuveShift

Jared Williams
fuente
1
  1. Abrir una nueva terminal
  2. Encuentra el ID del contenedor en ejecución docker ps
  3. Matar el contenedor docker kill ${containerId}
Vyacheslav Cotruta
fuente
0

para detener un proceso de docker y liberar los puertos, primero use ctrl- cpara salir de la salida del contenedor y luego use docker ps para encontrar la lista de contenedores en ejecución. Luego puede usar el contenedor Docker Stop para detener ese proceso y liberar sus puertos. El nombre del contenedor que puede encontrar en el comando docker ps que da el nombre en la columna de nombre. Espero que esto resuelva tus consultas ...

shankar
fuente
0

Si solo necesita que el proceso de acoplador vaya en segundo plano, puede usar

Ctrl + Z

Tenga en cuenta que no es una separación real y viene con una penalización de rendimiento. (Puede devolverlo a primer plano con el bgcomando).

Otra opción es simplemente cerrar su terminal, si ya no lo necesita.

Tom
fuente
0

Para cualquiera que se haya encontrado con el mismo problema que yo tuve (no se puede desconectar sin matar el contenedor, incluso cuando se configura la tecla de desconexión) ......

Al comenzar sus contenedores con docker-compose up -d

en lugar de usar docker attach {container name}para ver el registro de colas ...

try docker-compose logs -f {service name} ctrl- cmata la cola del tronco sin matar tu contenedor

{service name}ser el servicio que figura en el lado de su archivo docker-compose.yml .. (por ejemplo, mientras que el nombre del contenedor = elk_logstash_1 -> nombre del servicio = logstash

HTH

Lon Kaut
fuente
0

Actualizar

Por lo general, usaba Docker Attach para ver qué mostraba STDOUT, para solucionar problemas de contenedores. Acabo de encontrardocker logs --follow 621a4334f97b , lo que me permite ver el STDOUT al mismo tiempo que puedo controlarlo sin afectar el funcionamiento del contenedor! Exactamente lo que siempre he querido.

... naturalmente, deberá sustituir su propia ID de contenedor.

Respuesta original

Quería dejar el contenedor en funcionamiento, pero me había conectado sin iniciar el contenedor -it. Mi solución fue sacrificar mi conexión SSH en su lugar (ya que fui SSHed en la máquina que ejecutaba los contenedores). Matar esa sesión ssh dejó el contenedor intacto pero me separó de él.

CenterOrbit
fuente