Python внутри контейнера докера, изящно останавливается - PullRequest
0 голосов
/ 19 декабря 2018

Я запускаю очень простой пример цикла Python внутри контейнера Windows Docker , который я бы хотел изящно остановить .

Сценарий запускается в моем файле Docker следующим образом:

CMD ["python.exe", "./test.py"]

В документации докера говорится, что сигнал SIGTERM отправляется основной команде, поэтому я пытаюсь уловить его следующим образом:

import signal
import time
import logging, sys

class GracefulKiller:
  kill_now = False
  def __init__(self):
    signal.signal(signal.SIGINT, self.exit_gracefully)
    signal.signal(signal.SIGTERM, self.exit_gracefully)

  def exit_gracefully(self,signum, frame):
    self.kill_now = True

if __name__ == '__main__':
  logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  killer = GracefulKiller()
  while True:
    time.sleep(1)
    logging.info("doing something in a loop ...")
    if killer.kill_now:
      break

  logging.info("End of the program. I was killed gracefully :)")

Теоретически сигнал должен быть перехваченобработчик, логическое значение должно переключаться, и цикл должен завершаться и отображать мою самую последнюю строку журнала.Это не так, это просто останавливает все это в тот момент, когда излучается сигнал (или, скорее, через 2-3 секунды)

C:\Users\Administrator\Documents\Projects\test>docker-compose up
Recreating test_1 ... done
Attaching to test_1
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
Gracefully stopping... (press Ctrl+C again to force)
Stopping test_1   ... done

Мой журнал последней строки никогда не достигает .Кто-нибудь знает, что происходит?Это проблема, связанная с Python, Docker или Windows?

Также я попытался проверить остановленный контейнер с помощью журналов докера, последнего журнала тоже здесь нет.Пытался добавить сон после него, тот же результат.

Спасибо,

1 Ответ

0 голосов
/ 19 декабря 2018

Просто поймай KeyboardInterrupt и все.

if __name__ == '__main__':
  logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  try:
    while True:
      time.sleep(1)
      logging.info("doing something in a loop ...")
  except KeyboardInterrupt as ex:
    print('goodbye!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...