Правильный способ отсоединения от контейнера, не останавливая его
В Docker 1.1.2 (последний), какой правильный способ отсоединиться от контейнера, не останавливая его?
Так, например, если я попробую:
-
docker run -i -t foo /bin/bash
или
-
docker attach foo
(для уже запущенного контейнера)
оба из которых доставят меня к терминалу в контейнере, как я могу выйти из контейнерного терминала, не останавливая его?
exit
и CTR+C
обе остановки контейнера.
Ответы
Ответ 1
Обновление: Как указано в ответах ниже Ctrl + p, Ctrl + q теперь превратят интерактивный режим в режим демона.
Хорошо Ctrl + C (или Ctrl + \) должны отсоединить вас от контейнера, но это убьет контейнер, потому что ваш основной процесс - bash.
Небольшой урок о докере. Контейнер не является полноценной полнофункциональной ОС. Когда вы запускаете контейнер, процесс, который вы запускаете, берет PID 1 и принимает мощность инициализации. Поэтому, когда этот процесс завершается, демон останавливает контейнер до тех пор, пока не будет запущен новый процесс (через запуск Docker) (дополнительные пояснения по этому вопросу http://phusion.github.io/baseimage-docker/#intro).
Если вы хотите, чтобы контейнер постоянно работал в автономном режиме, я предлагаю вам использовать
docker run -d foo
С ssh-сервером на контейнере. (самый простой способ - следовать учебному пособию по докеризации openssh https://docs.docker.com/engine/examples/running_ssh_service/)
Или вы можете просто перезапустить свой контейнер через
docker start foo
(он будет отключен по умолчанию)
Ответ 2
Тип Ctrl + p, Ctrl + q поможет вам переключить интерактивный режим в режим демон.
См. https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell.
# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")
Ответ 3
Я копался в этом, и все ответы выше частично верны. Все зависит от того, как запускается контейнер. При запуске контейнера все сводится к следующему:
- был выделен TTY (
-t
) - был оставлен стандартным (
-i
)
^P^Q
работает, НО только когда -t
и -i
используются для запуска контейнера:
[[email protected]]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[[email protected]]$ docker attach test
# here I typed ^P^Q
read escape sequence
# i'm back to my prompt
[[email protected]]$ docker kill test; docker rm -v test
test
test
ctrl+c
работает, НО только когда -t
(без -i
) используется для запуска контейнера:
[[email protected]]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d
[[email protected]]$ docker attach test
^C
[[email protected]]$
Третий способ отделить
Есть способ отсоединиться, не убивая контейнер, хотя; вам нужна другая оболочка Таким образом, выполнение этого в другой оболочке отсоединилось и оставило контейнер с запущенным pkill -9 -f 'docker.*attach'
:
[[email protected]]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[[email protected]]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z
# go to another shell and run the 'pkill' command above
# i'm back to my prompt
[[email protected]]$
Зачем? Потому что вы убиваете процесс, который связывал вас с контейнером, а не с самим контейнером.
Ответ 4
Если вы используете "docker attach" id контейнера, вы попадаете в контейнер.
Чтобы выйти из контейнера без остановки контейнера, вам нужно ввести "Ctrl + P + Q"
Ответ 5
Я считаю, что ответ Ашвина является самым правильным, мой старый ответ ниже.
Я хотел бы добавить еще один вариант, который должен запускать контейнер следующим образом
docker run -dti foo bash
Затем вы можете ввести контейнер и запустить bash с помощью
docker exec -ti ID_of_foo bash
Не нужно устанавливать sshd:)
Ответ 6
Способ отсоединения от интерактивного контейнера по умолчанию - Ctrl + P Ctrl + Q, но вы можете переопределить его при запуске нового контейнера или присоединении к существующему контейнеру с помощью флага --detach-keys.
Ответ 7
Если вы подключились через docker attach
, вы можете отсоединиться, убив процесс присоединения докеров.
Лучше всего использовать параметр sig-proxy, чтобы не пропускать Ctrl + C в ваш контейнер:
docker attach --sig-proxy=false [container-name]
Та же опция доступна для команды docker run
.
Ответ 8
Вы можете использовать --detach-keys
при запуске docker attach
чтобы переопределить последовательность CTRL+P, CTRL + Q
по умолчанию (это не всегда работает).
Например, когда вы запускаете docker attach --detach-keys="ctrl-a" test
и нажимаете CTRL+A
вы выходите из контейнера, не убивая его.
Другие примеры:
-
docker attach --detach-keys="ctrl-a,x" test
- нажмите CTRL+A
и затем X
для выхода -
docker attach --detach-keys="a,b,c" test
- нажмите A
, затем B
, затем C
чтобы выйти
Выписка из официальной документации:
Если вы хотите, вы можете настроить переопределение последовательности клавиш Docker для отсоединения. Это полезно, если последовательность Docker по умолчанию конфликтует с последовательностью клавиш, которую вы используете для других приложений. Есть два способа определить собственную последовательность ключей отсоединения: переопределение для каждого контейнера или как свойство конфигурации во всей конфигурации.
Чтобы переопределить последовательность для отдельного контейнера, используйте --detach-keys="<sequence>"
с командой присоединения docker. Формат <sequence>
- это буква [aZ]
или ctrl-
сочетании с любым из следующего:
- az (один строчный буквенный символ)
- @(под знаком)
- [(левая скобка)
- \(две обратные косые черты)
- _ (нижнее подчеркивание)
- ^ (карета)
Эти значения a
, ctrl-a
, X
или ctrl-\\
являются примерами допустимых последовательностей ключей. Чтобы настроить другую последовательность ключей конфигурации по умолчанию для всех контейнеров, см. Раздел "Файл конфигурации ".
Примечание: Это работает начиная с версии 1. Docker 10+ (на момент этого ответа текущая версия была 18.03)
Ответ 9
Если вы просто хотите увидеть выходные данные процесса, запущенного из контейнера, вы можете сделать простой docker container logs -f <container id>
.
Флаг -f
позволяет followed
и обновлять вывод контейнера в режиме реального времени. Очень полезно для отладки или мониторинга.