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


459

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

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


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чтобы отделить


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, хотя я не нашел это полезным.


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"

9

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


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

4

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


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


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 оставило контейнер нетронутым, но оторвало меня от него.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.