Python在docker容器内,优雅地停止

2024-09-30 20:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个WindowsDocker容器中运行一个非常基本的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秒之后)

^{pr2}$

我的最后一行日志从未到达。 有人知道发生了什么事吗?这是python特有的问题,docker特有的还是Windows特有的?在

我还试着用docker日志检查停止的容器,最后一个日志也不在这里。试着在它之后加一个睡眠,结果是一样的。在

谢谢


Tags: dockerimportselfsignaltime信号loggingsys
1条回答
网友
1楼 · 发布于 2024-09-30 20:20:20

抓住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!')

相关问题 更多 >