Проблема в том, что Ctrl-C посылает сигнал процессу верхнего уровня внутри контейнера, но этот процесс не обязательно реагирует так, как вы ожидаете. Процесс верхнего уровня имеет идентификатор 1 внутри контейнера, что означает, что он не получает обработчики сигналов по умолчанию, которые обычно имеют процессы. Если процесс верхнего уровня является оболочкой, то он может получать сигнал через свой собственный обработчик, но не перенаправляет его команде, которая выполняется внутри оболочки. Подробности объясняются здесь. В обоих случаях док-контейнер действует так, как будто он просто игнорирует Ctrl-C.
Начиная с docker 0.6.5
, вы можете добавить -t
к команде запуска docker, которая прикрепит файл pseudo-TTY
. Затем вы можете ввести Control-C
, чтобы отсоединиться от контейнера, не прерывая его.
Если вы используете -t
и -i
, то Control-C завершит работу контейнера. При использовании -i with -t
вам нужно использовать Control-P Control-Q
для отсоединения без завершения.
Тест 1:
$ ID=$(sudo docker run -t -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
Control-P Control-Q
$ sudo docker ps
Контейнер все еще указан.
Тест 2:
$ ID=$(sudo docker run -t -i -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
Control-C
$ sudo docker ps
контейнера там нет (он был завершен). Если вы наберете Control-P
Control-Q
вместо Control-C во втором примере, контейнер все равно будет работать.
Оберните программу bash-скриптом docker-entrypoint.sh, который блокирует процесс контейнера и способен перехватывать ctrl-c. Этот пример bash может помочь: https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
#!/bin/bash
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
echo "** Trapped CTRL-C"
}
for i in `seq 1 5`; do
sleep 1
echo -n "."
done
person
NID
schedule
12.12.2016