[Docker] Как вы присоединяетесь и отключаетесь от процесса Докера?


Answers

Проверьте также https://docs.docker.com/engine/reference/commandline/attach/ :

docker attach --sig-proxy=false 304f5db405ec

Затем используйте CTRL+c для отсоединения

Question

Я могу подключиться к процессу докера, но Ctrl + c не работает, чтобы отсоединиться от него. exit основном останавливает процесс.

Каков рекомендуемый рабочий процесс, чтобы запустить процесс, иногда прикрепляться к нему, чтобы внести некоторые изменения, а затем отсоединить?




Чтобы отсоединиться от контейнера, вы просто удерживаете Ctrl и нажимаете P + Q.

Чтобы подключиться к работающему контейнеру, вы используете:

$ docker container attach "container_name"



В той же оболочке удерживайте клавишу ctrl и нажмите клавиши p затем q




Чтобы отсоединиться от работающего контейнера, используйте ^ P ^ Q (удерживайте Ctrl , нажмите P , нажмите Q , отпустите Ctrl ).

Есть уловка: это работает, только если контейнер был запущен с -t и -i .

Если у вас есть запущенный контейнер, который был запущен без одного (или обоих) этих параметров, и вы прикрепляетесь приложением docker attach , вам нужно будет найти другой способ отсоединения. В зависимости от выбранных вами параметров и запущенной программы ^ C может работать, или может убить весь контейнер. Вам придется экспериментировать.

Другой улов: в зависимости от программ, которые вы используете, ваш терминал, оболочка, клиент SSH или мультиплексор могут перехватывать либо ^ P, либо ^ Q (как правило, последний). Чтобы проверить, не является ли эта проблема, попробуйте запустить или подключиться с --detach-keys z . Теперь вы можете отсоединиться, нажав z , без каких-либо модификаторов. Если это работает, другая программа вмешивается. Самый простой способ обойти это - установить свою собственную последовательность отсоединения, используя аргумент --detach-keys . (Например, чтобы выйти с помощью ^ K , используйте --attach-keys 'ctrl-k' .) В качестве альтернативы вы можете попытаться отключить перехват ключей в вашем терминале или другой мешающей программе. Например, stty start '' или stty start undef может помешать терминалу перехватить ^ Q на некоторых системах POSIX, хотя я не нашел, что это полезно.




Я думаю, что это должно зависеть от ситуации. Возьмем в качестве примера следующий контейнер:

# 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) Используйте « docker attach » для прикрепления контейнера:

Так как « docker attach » не будет выделять новый tty, но повторно использует исходный запуск tty, поэтому, если вы запустите команду exit , это приведет к завершению работы контейнера:

# 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

Поэтому, если вы действительно не хотите сделать запуск контейнера, вы должны использовать Ctrl + p + Ctrl + q .

(2) Используйте " docker exec "

Поскольку « docker exec » будет выделять новый tty, поэтому я думаю, что вы должны использовать exit вместо Ctrl + p + Ctrl + q .

Следующее выполняет Ctrl + p + Ctrl + q, чтобы закрыть контейнер:

# 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

Затем снова войдите в контейнер для входа, вы увидите, что процесс bash в preavious команде docker exec все еще жив (PID равно 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



Links