Я запускаю очень простой пример цикла 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?
Также я попытался проверить остановленный контейнер с помощью журналов докера, последнего журнала тоже здесь нет.Пытался добавить сон после него, тот же результат.
Спасибо,