Докер не отвечает на CTRL+C в терминале
возникли проблемы с Docker на данный момент; я использую его для запуска изображения, которое запускает ноутбук ipython при запуске. Я хочу внести некоторые изменения в сам ноутбук ipython, поэтому мне нужно закрыть его после запуска.
однако нажатие CTRL+C в терминале просто вводит "^C " в виде строки. Кажется, нет реального способа использовать CTRL+C для фактического закрытия экземпляра ноутбука ipython.
У кого-нибудь есть какие-либо подсказки о том, что может вызвать это, или знать о любом решения для этого?
4 ответов
этот пост предлагает CTRL-Z в качестве обходного пути для отправки процесса в фоновый режим, а затем убийства процесса по его идентификатору процесса: не удается убить скрипт Python с помощью Ctrl-c
возможные проблемы:
программа ловит ctrl-c и ничего не делает, очень маловероятно.
есть фоновые процессы, которые не удалось правильно. Только основной процесс получает сигнал, а подпроцессы зависают. Скорее всего что происходит?
Предлагаемое Решение:
проверьте документацию по программам о том, как она правильно запущена и остановлена. ctrl-c кажется неправильным способом.
оберните программу с помощью docker-entrypoint.sh сценарий bash, который блокирует процесс контейнера и может поймать ctrl-C. Этот пример bash должен помочь: https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
после ловли ctrl-c вызовите правильный метод выключения для ноутбука ipython.
проблема в том, что Ctrl-C посылает сигнал процессу верхнего уровня внутри контейнера, но этот процесс не обязательно реагирует так, как вы ожидаете. Процесс верхнего уровня имеет ID 1 внутри контейнера, что означает, что он не получает обработчики сигналов по умолчанию, которые обычно имеют процессы. Если процесс верхнего уровня является оболочкой, он может получать сигнал через свой собственный обработчик, но не передает его команде, которая выполняется в оболочке. Объяснил детали здесь. В обоих случаях контейнер docker действует так, как будто он просто игнорирует Ctrl-C.
Если вы создаете свои собственные изображения, решение состоит в том, чтобы запустить минимальный процесс инициализации, такой как Тини или dumb-init, как процесс верхнего уровня внутри контейнера.
ответ@maybeg уже очень хорошо объясняет, почему это может произойти.
Что касается остановки невосприимчивого контейнера, другое решение-просто выдать docker stop <container-id>
в другой терминал. В отличие от CTRL-C, docker stop
не отправляет SIGINT, а сигнал SIGTERM, на который процесс может реагировать по-разному.
использование: контейнер docker stop [OPTIONS] [CONTAINER...]
остановите работающий контейнер, отправив SIGTERM, а затем SIGKILL после льготного периода
Если это не удается, используйте docker kill <container-id>
который немедленно отправляет SIGKILL.
С этот пост на досках объявлений Docker:
откройте новую оболочку и выполните
$ docker ps # get the id of the running container
$ docker stop <container> # kill it (gracefully)
Это хорошо сработало для меня. CTRL-Z, CTRL - \ и т.д. только появились как строки, но это убило контейнер Docker и вернуло вкладку на вход терминала.