run - download docker image
Manera correcta de desprenderse de un contenedor sin detenerlo. (9)
En Docker 1.1.2 (más reciente), ¿cuál es la forma correcta de desprenderse de un contenedor sin detenerlo?
Así por ejemplo, si lo intento:
-
docker run -i -t foo /bin/bash
o -
docker attach foo
(para contenedor ya en ejecución)
ambos me llevan a una terminal en el contenedor, ¿cómo salgo de la terminal del contenedor sin detenerla?
exit
y CTR+C
ambos detienen el contenedor.
Cavé en esto y todas las respuestas anteriores son parcialmente correctas. Todo depende de cómo se lance el contenedor. Se reduce a lo siguiente cuando se lanzó el contenedor:
- fue un TTY asignado (
-t
) - fue dejado abierto (
-i
)
^P^Q
funciona BUT: debe especificar -t
y -i
cuando inicie 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 BUT: solo debe especificar -t
cuando inicie 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 separar sin matar el contenedor; Necesitas otro shell. En resumen, ejecutar esto en otro shell separado y dejar el contenedor ejecutando 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á matando el proceso que lo conectó con el contenedor, no el contenedor en sí.
Considero que la respuesta de Ashwin es la más correcta, mi respuesta anterior se encuentra a continuación.
Me gustaría agregar otra opción aquí que es ejecutar el contenedor de la siguiente maneradocker run -dti foo bash
A continuación, puede entrar en el contenedor y ejecutar bash con
docker exec -ti ID_of_foo bash
No es necesario instalar sshd :)
Escriba Ctrl + p , Ctrl + q le ayudará a cambiar el modo interactivo al modo daemon.
Consulte 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")
La forma predeterminada de desconectarse de un contenedor interactivo es Ctrl + P Ctrl + Q , pero puede anularlo al ejecutar un nuevo contenedor o adjuntarlo a un contenedor existente usando el indicador --detach-keys .
Puede usar la opción --detach-keys
cuando ejecute la función docker attach
para anular la secuencia predeterminada de CTRL+P, CTRL + Q
(eso no siempre funciona).
Por ejemplo, cuando ejecute docker attach --detach-keys="ctrl-a" test
y presione CTRL+A
, saldrá del contenedor, sin matarlo.
Otros ejemplos:
-
docker attach --detach-keys="ctrl-a,x" test
- presioneCTRL+A
y luegoX
para salir -
docker attach --detach-keys="a,b,c" test
- presioneA
, luegoB
, luegoC
para salir
Extracto de la documentación oficial:
Si lo desea, puede configurar y anular la secuencia de teclas de Docker para desconectar. 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 el --detach-keys="<sequence>"
con el comando de --detach-keys="<sequence>"
docker. El formato de la <sequence>
es una letra [aZ]
o la combinación de ctrl-
con cualquiera de los siguientes:
- az (un solo carácter alfa en minúscula)
- @ (a la señal)
- [(corchete izquierdo)
- / (dos barras inclinadas hacia atrás)
- _ (guion bajo)
- ^ (caret)
Estos valores a, ctrl-a
, X
o ctrl-//
son todos ejemplos de secuencias de claves válidas. Para configurar una secuencia de teclas predeterminada de configuración diferente para todos los contenedores, consulte la sección Archivo de Configuration .
Nota: Esto funciona desde la versión 1.10+ de la ventana acoplable (en el momento de esta respuesta, la versión actual es 18.03)
Si realiza la "identificación de contenedor" adjunta a la ventana acoplable, ingresa al contenedor. Para salir del contenedor sin detener el contenedor, debe ingresar "Ctrl + P + Q"
Si se docker attach
través de la docker attach
, puede separar 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 comando de docker run
.
Si solo desea ver el resultado del proceso que se ejecuta desde dentro del contenedor, puede hacer un docker container logs -f <container id>
simple docker container logs -f <container id>
.
El indicador -f
hace para que la salida del contenedor se followed
y actualice en tiempo real. Muy útil para la depuración o el seguimiento.
Actualización: Como se menciona en las siguientes respuestas, Ctrl + p , Ctrl + q ahora cambiará el modo interactivo al modo daemon.
Bueno, Ctrl + C (o Ctrl + / ) debería separarlo del contenedor, pero eliminará el contenedor porque su proceso principal es un bash.
Una pequeña lección sobre docker. El contenedor no es un verdadero sistema operativo completo. Cuando ejecuta un contenedor, el proceso que inicia toma el PID 1 y asume el poder de inicio. Entonces, cuando se termina ese proceso, el daemon detiene el contenedor hasta que se inicia un nuevo proceso (a través del inicio de la ventana acoplable) (Más explicaciones 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 sencilla es seguir el tutorial de docker de openssh https://docs.docker.com/engine/examples/running_ssh_service/ )
O simplemente puede relanzar su contenedor a través de
docker start foo
(será separado por defecto)