You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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立即
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:24:59