Docker容器停止时Python脚本SIGTERM信号未触发问题排查
Docker环境下Asyncio脚本无法优雅处理SIGTERM的问题解决
问题根源
执行docker container stop时,Docker会先向容器的PID1进程发送SIGTERM信号,等待10秒后若进程未退出,再发送SIGKILL强制终止。你的场景中存在两个核心问题:
- 容器启动后,PID1是
sh进程(来自docker-entrypoint.sh)而非Python进程,默认情况下sh不会将接收到的SIGTERM信号转发给子进程,导致Python的信号处理器根本无法触发 - 原Python代码使用同步信号处理器抛出
KeyboardInterrupt,在asyncio.run()的事件循环环境中,存在信号处理时机不匹配的问题,无法正确中断循环并触发优雅退出
解决方案
1. 修改Entrypoint脚本,让Python进程接收信号
有两种可靠方式确保Python进程能收到Docker发送的SIGTERM信号:
方式一:用exec替换Shell进程(推荐)
修改docker-entrypoint.sh,使用exec命令启动Python,让Python进程直接替换当前sh进程成为PID1,Docker发送的信号会直接被Python接收:
#!/bin/sh set -e . /venv/bin/activate # 使用exec替换当前shell进程,让Python成为PID1立即
相关产品推荐
相关产品推荐

