2016-10-30 2 views
2

Я пытаюсь изящно закрыть службу, которую я запускаю в контейнере докера (на малине pi 3 b, работающей на raspbian lite), поскольку просто выдает «докер-стоп» 'прерывает службу (файл блокировки не очищается)bash script command «trap» не работает в контейнере докеров

В моих интернет-исследованиях люди, работающие с командой «trap» команды bash, выполняют команду, когда скрипт получает сигнал на завершение.

Я попытался это следующим:

docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' INT; echo waiting; read" 

Когда я запускаю выше команды, «ожидание» печатается на экране и, когда я ударил CTRL + C, сообщение «выключая» появляется. - Именно так, как я хочу!

Единственная проблема заключается в том, что я не могу получить этот сигнал, отправленный в сценарий bash из-за контейнера докера. Я попытался (в параллельной сессии SSH):

docker kill --signal="INT" trap 
docker kill --signal="SIGINT" trap 

Кроме того, я попытался использовать сигнал по умолчанию, отправляемый на «Docker остановки», но это привело к консоли ожидания ~ 10s (по умолчанию докер stop timeout), а затем убивает контейнер докера.

docker stop trap 

Ни один из методов не получил сообщение «shutting down» для печати на экране.

Я бы очень признателен за любую помощь.

Edit 1: Он не работает с SIGTERM либо (когда я либо из следующих команд, а затем выдать «Docker стоп» Я до сих пор не получаю сообщение «выключая»).

docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' TERM; echo waiting; read" 
docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read" 

Обход: Изображение, кажется, проблема. Входная точка '/usr/bin/entry.sh' захватывает сигнал. Я попробовал его с другим изображением, и она работала:

$ docker run -it --name trap digitallyseamless/archlinux-armv6h /bin/bash -c " trap 'echo shutting down ; exit 0' SIGTERM; echo waiting; read" 

Остановите контейнер с помощью (из другого терминала)

$ docker stop trap 

Затем просмотрите выходным контейнером

$ docker logs trap 
waiting 
shutting down 

Поскольку у меня есть нет особой необходимости использовать конкретное изображение (это действительно просто средство для достижения моей цели), я просто поменяю изображения.

PS: Огромное спасибо @tkausl

+1

'docker stop' отправляет SIGTERM – tkausl

+0

вы можете взглянуть на это - http://stackoverflow.com/questions/40298849/gracefully-stop-phusion-passenger-running-on-apache/40299520#40299520 – Rao

+0

@tkausl, к сожалению, это не работает (см. Редактировать 1) – EvilDevil

ответ

1

Docker остановить и Докер убить посылают сигнал, а не команду ловушкой. Вы должны сделать docker exec container_name trap

+0

Извините, если мой вопрос был не ясен. >> отключение эхо-ловушки; exit 'INT << может поймать сигнал и обработать его, как мне нравится (он работает, когда я нахожусь в контейнере докера, но не тогда, когда я вызываю «остановку докера» из-за пределов контейнера) – EvilDevil

1

Как я упоминал в комментариях, docker stop отправляет SIGTERM. В соответствии с вашими изменениями, это не сработает для вас, однако я просто попробовал его с помощью той же самой команды (изменил изображение на ubuntu), и он работает. Возможно, вы отделились от бегущей коробки?В этом случае вы явно не видите сообщение, удалите флаг --rm и посмотрите на docker logs.

Как я это сделал:

В одном терминале:

docker run --rm -it --name trap ubuntu /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read" 

Во втором терминале:

$ docker stop f6 
f6 

То, что я вижу в первом терминале после остановки:

$ docker run --rm -it --name trap ubuntu /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read" 
waiting 
shutting down  
$ 
+0

Странно! Я заменил «ubuntu» на «смола/rpi-raspbian», и он не работает, мне кажется, что это ошибка – EvilDevil

+0

Я не знаю расианского изображения, но я полагаю, что точка входа как-то ловут сигнал – tkausl

+1

Да, точка входа '/ usr/bin/entry.sh' ловушки, он должен работать, если вы переопределите точку входа. – tkausl

Смежные вопросы