【发布时间】:2018-12-19 13:51:34
【问题描述】:
我正在 Windows docker 容器 中运行一个非常基本的 Python 循环示例,我想优雅地停止。
脚本在我的 dockerfile 中以这种方式启动:
CMD [ "python.exe" , "./test.py"]
在 docker 文档中,据说 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?
我还尝试使用 docker 日志检查已停止的容器,最后一个日志也不在这里。尝试在其后添加睡眠,结果相同。
谢谢,
【问题讨论】:
-
你有没有让这个与
docker-compose一起工作?