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


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.