Як ви приєднуєтесь і відриваєтесь від процесу Докера?


459

Я можу приєднатися до докерного процесу, але Ctrl+ cне працює, щоб від'єднатись від нього. exitв основному зупиняє процес.

Який робочий процес рекомендований для запуску процесу, періодично приєднуючись до нього, щоб внести якісь зміни, а потім від'єднати?


4
Під час використання nsenter я просто Ctrl-D.
user2105103

Чи має закриття xterm, konsoleі т.д. роботи? Це працює для мене (я відриваюсь).
Вітеніс Бівайніс

Відповіді:


668

Щоб від'єднати tty, не виходячи з оболонки, скористайтеся послідовністю евакуації Ctrl+, Pа потім Ctrl+ Q. Детальніше тут .

Додаткова інформація з цього джерела :

  • docker run -t -i → може бути від'єднаний ^P^Qі приєднаний за допомогою прикріплення докер
  • docker run -i → не можна від'єднати ^P^Q; порушить stdin
  • пробіг докера → не можна від'єднати ^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"в командному рядку з вкладкою тощо.
Matthew Hannigan

4
Ctrl + Zне відривається; це просто передує процесу. Це не те саме, що від'єднання та несе пенальті за виконання.
Зенексер

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 shell, і ви можете вийти з нього за допомогою Ctrl+ Cбезпосередньо, це не вплине на початковий процес.


6
Це спрацювало, ви можете ввести "вихід", як тільки ви закінчите, не впливаючи на початковий процес.
Eko3alpha

Це прекрасний спосіб приєднати до запущеного контейнера. Але що робити, якщо (скажіть) у контейнері працює якийсь процес, і я хочу перезапустити цей процес? Ах, я можу просто вбити старий процес, перезапустити новий і використовувати Cp, Cq, який працює, оскільки це інтерактивний tty. Мені також подобається метод --sig-proxy = false, але це більш універсально і не змушує зриву поточного процесу.
таранакі

"прикріпити" має специфічне значення з Докером, і 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процес у чіткій 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
Зверніть увагу, якщо на екрані відображаються два підписи, то перший є батьківським. Ви повинні використовувати другий під для вбивства, docker attachа не його батьківського.
joeytwiddle

11

Щоб від'єднатись від контейнера, просто утримуйте Ctrlта натисніть P+Q .

Щоб приєднати до запущеного контейнера, ви використовуєте:

$ docker container attach "container_name"

9

У мене була така ж проблема, ctrl- Pі Qне буде працювати, ні ctrl- C... врешті-решт я відкрив ще один термінальний сеанс, і я зробив "docker stop containerid " і "docker start containerid ", і це було зроблено роботу. Дивно.


Це не спрацює, якщо ви запустили контейнер із --rmпрапором. Ctrl+Pі Ctrl+Qпрацює, якщо ви запустили контейнер із -itпрапором.
Aswath K

4

У цій же оболонці утримуйте ctrlклавішу та натисніть клавіші pпотімq


3
Це працює лише в тому випадку, якщо ви запустили контейнер із -itпрапором.
Асват К


1
  1. Відкрийте новий термінал
  2. Знайдіть ідентифікатор запущеного контейнера docker ps
  3. Вбити контейнер docker kill ${containerId}

0

щоб зупинити процес докера та звільнити порти, спочатку скористайтеся ctrl- cзалиште вихід контейнера, а потім використовуйте docker ps, щоб знайти список запущених контейнерів. Тоді ви можете використовувати зупинку контейнера докер, щоб зупинити цей процес та звільнити його порти. Ім’я контейнера ви можете знайти в команді 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

HTH


0

Оновлення

Зазвичай я використовую док-фіксатор, щоб побачити, що відображається STDOUT, для усунення несправностей з контейнерами. Я щойно знайшовdocker logs --follow 621a4334f97b , що дозволяє мені бачити STDOUT, в той час як він також може мати ctrl + c від нього, не впливаючи на роботу контейнера! Саме те, що я завжди хотів.

... природно, вам потрібно буде замінити власний ідентифікатор контейнера.

Оригінальний відповідь

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.