Как отсоединиться от контейнера Docker, не останавливая его
Контейнеры Docker имеют интерактивный режим, который позволяет вам присоединять входные и выходные потоки вашего терминала к процессу контейнера. Нажатие Ctrl-C обычно завершает это
процесс, в результате чего контейнер останавливается. Здесь можно отключиться от сеанса, не останавливая контейнер.
Отрыв без остановки
Docker поддерживает комбинацию клавиш для изящного отсоединения от контейнера. Нажмите Ctrl-P, а затем Ctrl-Q, чтобы отключиться от соединения.
Вы вернетесь в свою оболочку, но ранее подключенный процесс останется активным, поддерживая работу вашего контейнера. Вы можете проверить это, используя docker ps
, чтобы получить список запущенных контейнеров.
Нажатие Ctrl-C или запуск команды exit
обычно завершает процесс переднего плана контейнера, если он не был специально настроен. Контейнер Docker должен иметь работающий процесс переднего плана; контейнер без него войдет в остановленное состояние.
Изменение последовательности отсоединения клавиатуры
Вы можете изменить последовательность отсоединения в соответствии со своими предпочтениями или избежать конфликта с сочетаниями клавиш, поддерживаемыми вашим приложением. Добавьте свойство detachKeys
в файл ~/.docker/config.json
, чтобы указать ключи, которые вы хотите использовать.
Docker поддерживает символы a-z
и символы @
, ^
и _
, а также знак левой квадратной скобки. ([
) и две обратные косые черты (\
). Все они используются вместе с клавишей Ctrl-
; буквы также можно использовать по отдельности, без Ctrl
.
Ключевые последовательности выражаются в виде списка, разделенного запятыми:
{ "detachKeys": "Ctrl-d,d" }
В этом примере контейнер будет отсоединен, когда вы нажмете Ctrl-D
, а затем сразу же нажмете клавишу d
.
Изменение последовательности для каждого контейнера
Помимо изменения вашей глобальной конфигурации, Docker принимает переопределения detachKeys
для каждого контейнера и каждого вложения. Добавьте флаг --detach-keys
к командам, которые могут присоединяться к процессам-контейнерам для установки определенной последовательности.
Команды, которые поддерживают это:
запуск докера
запуск докера
выполнение докера
подключение докера
Вот как подключиться к контейнеру, а затем использовать Ctrl-d
с символом подчеркивания для отсоединения:
docker attach my-container --detach-keys="Ctrl-d,_"
Флаг --detach-keys
использует тот же формат последовательности клавиш, что и параметр конфигурации detachKeys
. Флаг переопределяет настройку docker.json
; это, в свою очередь, переопределяет последовательность Ctrl-P/Ctrl-Q Docker по умолчанию.
Отсоединение, когда последовательность клавиатуры не работает
Иногда вы можете столкнуться с процессом-контейнером, который отказывается отсоединиться, даже когда вы вводите последовательность клавиш. Это может произойти, если входной поток контейнера не подключен к вашему терминалу (флаг -i
) или ему не выделен псевдо-TTY (флаг -t
). Вы также можете столкнуться с этой проблемой, если процесс вашего контейнера обрабатывает последовательность клавиш отключения, и вы не переопределили ее при подключении.
При таких обстоятельствах все еще возможно отсоединить ваш терминал от контейнера. Вам нужно временно открыть другое окно оболочки и использовать его, чтобы завершить процесс docker.attach
, поддерживающий вложение активным.
Сначала найдите идентификатор процесса вложения:
ps -ef | grep attach
Используйте выходные данные ps
, чтобы определить процесс docker.attach
, который нужно убить. Команда в столбце CMD
должна идентифицировать искомое вложение. Запишите соответствующий номер PID и используйте команду kill
, чтобы убить этот процесс:
kill -9 <PID>
Вы должны увидеть, как исходная оболочка отсоединяется от контейнера Docker и возвращается в нормальное рабочее состояние. Теперь вы можете закрыть вторую оболочку и продолжить использовать исходную.
Этот метод работает, убивая процесс Docker CLI, который подключил терминал к контейнеру, а не процесс внутри контейнера, который поддерживает его работу. Ваш первоначальный терминал снова становится пригодным для использования, а контейнер остается в рабочем состоянии.
Повторное подключение к вашему контейнеру
Вы можете повторно подключиться к контейнерам с помощью команды docker attach
. Это автоматически прикрепляет потоки ввода, вывода и ошибок вашего терминала к указанному контейнеру:
docker attach my-container
Все три потока подключены по умолчанию. Вы можете опустить входной поток, передав флаг --no-stdin
. Вывод контейнера будет передаваться на ваш терминал, но вы не сможете вводить какие-либо данные.
Снова используйте последовательность клавиш для отсоединения или Ctrl-C
, чтобы остановить процесс и контейнер. Если вы используете Ctrl-C
или exit
, docker attach
правильно установит переменную $?
в вашей оболочке, чтобы вы можете проверить код выхода контейнера.
Краткое содержание
Правильный способ отсоединения от контейнера Docker — это довольно непонятная комбинация клавиш, которая возвращает вас обратно в вашу оболочку. Вы можете настроить эту последовательность, чтобы повысить запоминаемость и избежать конфликтов с обработкой клавиатуры вашего контейнера.
В некоторых случаях последовательности отсоединения клавиатуры могут быть неэффективными. По-прежнему можно отсоединиться от вашего контейнера, идентифицируя и убивая процесс, поддерживающий вложение. В этом сценарии следует использовать обычные команды Unix, такие как ps
и kill
.
Наконец, если вы хотите, чтобы ваш контейнер был постоянно отключен, запустите его с флагом -d
(docker run -d my-image:latest
). Это отправит контейнер прямо в фоновый режим и не выведет вывод в вашу оболочку. Отсоединенные контейнеры всегда видны с помощью команды docker ps
и могут быть остановлены с помощью docker stop my-container
.