Докер зависает на SIGINT, когда скрипт прерывает EXIT - PullRequest
0 голосов
/ 15 февраля 2019

Когда я запускаю скрипт в контейнере Docker, и скрипт перехватывает EXIT, и я посылаю Ctrl + C , Docker не может остановить контейнер.

Dockerfile

FROM alpine
RUN apk add --no-cache bash
COPY script.sh /
CMD ./script.sh

script.sh

#!/bin/bash
func() {
  echo "exit script"
}
trap func EXIT
echo "script"
sleep 30

Для запуска

$ docker build -t traps .
$ docker run -it traps

Увидев, что «скрипт» отражается, нажмите Ctrl + C .

Ожидается: «скрипт выхода» печатается, и контейнер выходит, возвращая управлениемой терминал, так же, как если бы не было ловушки EXIT.

Фактически: «скрипт выхода» напечатан, но контейнер все еще работает и удерживает мой терминал.

Чтобы усложнить ситуацию,если я добавлю ловушку SIGINT, все будет работать так, как я ожидал.При нажатии Ctrl + C сначала срабатывает ловушка SIGINT, затем ловушка EXIT, а затем контейнер.

Что происходит?И есть ли способ заставить вещи работать без добавления фиктивной ловушки SIGINT?

(Причина использования -t в первую очередь заключается в том, чтобы включить Ctrl + C .)

1 Ответ

0 голосов
/ 15 февраля 2019

Я запустил ваши файлы и определил, что bash перешел в состояние процессора 100% после нажатия Ctrl-C.Присоединение gdb или strace указывает на то, что это SIGSEGVing бесконечно.Если это так, вы можете обойти это, изменив shebang на:

#!/bin/bash -i

Или, в качестве альтернативы, команду CMD:

CMD /bin/bash -i ./script.sh

Может быть, посмотрите на этодля получения дополнительной информации: https://github.com/moby/moby/issues/4854

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...