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

459

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

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

Markl
источник
4
При использовании nsenter, я просто Ctrl-D.
user2105103
Имеет ли закрытие xterm, konsoleи т.д. работы? Это работает для меня (я отстранен).
Витенис Бивайнис

Ответы:

668

Чтобы отсоединить tty без выхода из оболочки, используйте escape-последовательность Ctrl+ с Pпоследующим Ctrl+ Q. Подробнее здесь .

Дополнительная информация из этого источника :

  • docker run -t -i → может быть отсоединен с помощью ^P^Qприсоединения докера
  • Docker run -i → не может быть отсоединен с помощью ^P^Q; нарушит стандартный ввод
  • Docker run → не может быть отсоединен с помощью ^P^Q; может SIGKILL клиент; можно подключить с помощью док-станции
Кен Кокрейн
источник
46
Это было бы отличным ответом, если бы оно действительно работало так, как описано в документации.
Allingeek
20
Я обнаружил, что даже при запуске с -it последовательность отсоединения завершается ошибкой, если вы также запускаете контейнер с флагом очистки (--rm). Это может быть очевидно для некоторых, но это кусает меня чаще, чем я хотел бы признать.
Allingeek
7
Другой вариант - просто закрыть окно терминала или cmd-w :)
buildmaestro
3
Вы можете установить настраиваемые ключи отсоединения, например, "detachKeys": "ctrl-a,a"в файле .docker / config.json или --detach-keys "ctrl-a,a"в командной строке с присоединением и т. Д.
Мэтью Ханниган
4
Ctrl + Zне отсоединяется; это просто фоны процесса. Это не то же самое, что отсоединение и несет в себе штраф за производительность.
Zenexer
178

Проверьте также в --sig-proxyопции :

docker attach --sig-proxy=false 304f5db405ec

Затем используйте CTRL+, cчтобы отделить

czerasz
источник
4
Чтобы попробовать это, начиная с запуска вместо присоединения, я попытался: docker run -ti --sig-proxy=false busybox top что, кажется, не работает, процесс завершается с помощью ctrl-c, но начиная с, docker run -t -sig-proxy=false busybox top кажется, работает и дает возможность выйти с помощью ctrl-c
Хеннинг,
Ctrl-cостановит контейнер также.
Эван Ху,
Это единственное решение из перечисленных здесь, которое работает для меня на сервере Debian 9 под управлением Docker 19.03.5. Вопрос в том, почему это не настройка по умолчанию для команд присоединения? Кажется, это наиболее распространенный вариант использования.
fviktor
Последовательности Ctrl-p, Ctrl-q у меня не работают (начинаются как присоединение контейнера докер xyz) .. но это работает. Спасибо @czerasz
PravyNandas
92

Если вы просто хотите внести некоторые изменения в файлы или проверить процессы, вот еще одно решение, которое вам, вероятно, понадобится.

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

sudo docker exec -ti [CONTAINER-ID] bash

запустит новый процесс с оболочкой bash, и вы можете выйти из него с помощью Ctrl+ Cнапрямую, это не повлияет на исходный процесс.

Колин Су
источник
6
Это сработало, вы можете набрать «выход», как только вы закончите, не влияя на исходный процесс.
Eko3alpha
Это отличный способ прикрепить к работающему контейнеру. Но что, если (скажем) у меня запущен какой-то процесс в контейнере, и я хочу перезапустить этот процесс? Ах, я могу просто убить старый процесс, перезапустить новый и использовать Cp, Cq, который работает, так как это интерактивный tty. Мне также нравится метод --sig-proxy = false, но он более универсален и не вызывает прерывания текущего процесса.
Таранаки
«присоединить» имеет определенное значение с Docker, и execэто не так.
frnhr
48

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

# 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» будет выделить новый телетайп, так что я думаю , вы должны использовать 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
Нань Сяо
источник
39

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

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

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

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

Zenexer
источник
2
Супер точное объяснение, сработало как шарм
Меир Габай,
27

когда больше ничего не работает, откройте новый терминал :

$ 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>
Ади Фатол
источник
Какая ловушка! Спасибо, это единственное, что сработало. -9не было необходимости.
Хит
Это также убивает контейнер - возможно, зависит от того, какие флаги были установлены.
AdamAL
1
Обратите внимание, что если отображаются два пида, то первый является родительским. Вы должны использовать второй pid, чтобы убить, docker attachа не его родителя.
Joeytwiddle
11

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

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

$ docker container attach "container_name"
GXG
источник
9

У меня была такая же проблема, ctrl- Pи Qне будет работать, и ctrl- C... в конце концов , я открыл еще одну терминальную сессию , и я сделал «Docker стоп containerid » и «старт докер containerid » и он получил работу. Weird.

Пьерлуиджи Вернетто
источник
Это не сработает, если вы запустили контейнер с --rmфлагом. Ctrl+Pи Ctrl+Qработает, если вы запустили контейнер с -itфлагом.
Асват К
4

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

ravthiru
источник
3
Это работает, только если вы запустили контейнер с -itфлагом.
Асват К
2

Я на Mac, и по какой-то причине Ctrl- p Ctrl- qбудет работать, только если я держуShift

Джаред Уильямс
источник
1
  1. Откройте новый терминал
  2. Найти идентификатор работающего контейнера docker ps
  3. Убить контейнер docker kill ${containerId}
Вячеслав Котрута
источник
0

чтобы остановить процесс Docker и освободить порты, сначала используйте ctrl- cчтобы выйти из контейнера, затем используйте Docker PS, чтобы найти список запущенных контейнеров. Затем вы можете использовать остановку Docker-контейнера, чтобы остановить этот процесс и освободить его порты. Имя контейнера вы можете найти в команде docker ps, которая дает имя в столбце имени. Надеюсь, что это решает ваши вопросы ....

Шанкар
источник
0

Если вам нужен только процесс докера, чтобы перейти в фоновом режиме, вы можете использовать

Ctrl + Z

Имейте в виду, что это не настоящий отрыв, и он идет с ухудшением производительности. (Вы можете вернуть его на передний план с помощью bgкоманды).

Другой вариант - просто закрыть свой терминал, если он вам больше не нужен.

Том
источник
0

Для тех, кто столкнулся с той же проблемой, что и я (не может отсоединиться, не убив контейнер, даже при установке ключа отсоединения) ......

При запуске ваших контейнеров с docker-compose up -d

вместо того, docker attach {container name}чтобы использовать для просмотра журнала хвостов ....

попробуйте docker-compose logs -f {service name} ctrl- cубивает хвост бревна, не убивая ваш контейнер

{service name}быть службой, перечисленной в стороне вашего файла docker-compose.yml .. (например, в то время как имя контейнера = elk_logstash_1 -> имя службы = logstash

НТН

Лон Каут
источник
0

Обновить

Я обычно использовал docker attach, чтобы увидеть, что отображал STDOUT, для устранения неполадок в контейнерах. Я только что обнаружил docker logs --follow 621a4334f97b, что позволяет мне видеть STDOUT, а также возможность ctrl + c от него, не влияя на работу контейнера! Именно то, что я всегда хотел.

... естественно вам нужно будет заменить свой собственный идентификатор контейнера.

Оригинальный ответ

Я хотел оставить контейнер работающим, но прикрепил его без запуска контейнера -it. Мое решение заключалось в том, чтобы вместо этого пожертвовать своим SSH-соединением (поскольку я был SSHed в машину, на которой работали контейнеры). Убийство этой сессии ssh оставило контейнер нетронутым, но оторвало меня от него.

CenterOrbit
источник