Как выйти и убить работающий Docker-контейнер с помощью CTRL + C? - PullRequest
0 голосов
/ 01 марта 2019

TL;DR: как мне написать Dockerfile или команды Docker для запуска Docker-контейнеров, чтобы я мог остановить и выйти из работающего Docker-контейнера, когда я нажму ctrl+c?


Background

Мне нужно запустить бесконечный цикл while в сценарии оболочки.Когда я запускал этот скрипт локально, команда ctrl+c выйдет из бесконечного цикла.

# content of sync.sh

while true; do
  echo "Do something!"
  some_syncing_command || {
    rm -rf /tmp/healthy && break
  }
  echo "Finish doing something!"
  touch /tmp/healthy
  sleep ${waitingSeconds}
done

Поэтому на основе сценария оболочки я создал образ Docker со следующим содержанием Dockerfile:

FROM debian:stretch 
COPY sync.sh .

ENTRYPOINT ["/sync.sh"]

и создайте образ, запустив docker build -t infinite-loop .

Проблема

Однако после попытки разных попыток запустить образ infinite-loop я не могу остановиться и выйти из режима работыДокер контейнер после удара ctrl + c.Вот команды Docker, которые я использовал для запуска образа Docker:

  1. docker run --rm to-infinity-1 infinite-loop
  2. docker run --rm -it to-infinity-2 infinite-loop
  3. docker run --rm -d to-infinity-3 infinite-loop, затем запустите docker attach наto-infinity-3

Всем вышеперечисленным командам не удается остановить и выйти из бесконечного цикла после непосредственного выполнения ctrl+c.Следовательно, мне нужно запустить docker stop [container-name], чтобы остановить работу контейнеров с бесконечными циклами.Что я должен изменить в своей реализации, чтобы решить эту проблему?

Спасибо.

Редактировать: дополнительный контекст, я использую kubernetes с контейнером бесконечного цикла.Интересно, будет ли эта проблема ctrl+c (связанная с SIGINT) мешать kubernetes, если я захочу изящно остановиться и выйти из работающей капсулы.Обратите внимание, что хотя ctrl+c проблематично, я все же смог использовать docker stop, чтобы остановить работающие контейнеры.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю, вам нужно использовать trap, вот пример моего кода:

done=0
trap 'done=1' TERM INT

while [ $done = 0 ]; do
  #doingstuff
  sleep $someinterval &
  wait
done

ctrl + c - это сигнал, поэтому вам понадобится обработчик сигнала.Кроме того, сон нужно будет выполнять в фоновом режиме, чтобы ваша ловушка не удерживалась до тех пор, пока сон не будет завершен.

[1] Ловушка: https://www.shellscript.sh/trap.html

0 голосов
/ 01 марта 2019

«Docker Run» перехватывает или игнорирует ctrl + c.

Если вы не хотите потерять свою оболочку, вы можете попытаться остановить контейнер из другого терминала на том же хосте Docker..

Откройте новую оболочку и выполните

$ docker ps # get the id of the running container
$ docker stop <container> # kill it (gracefully)

Процесс контейнера завершится, и ваша исходная оболочка будет выпущена.

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