GCE实例上Docker容器循环重启无报错,如何查询其重启原因?
排查Docker容器无报错自动重启的步骤
你观察到退出码始终为0,说明容器主进程是正常主动退出,并非触发系统级异常、OOM等故障退出,首先排查方向放在重启策略匹配、主进程运行逻辑两个维度,具体排查方法如下:
- 第一步:确认容器重启策略配置
执行以下命令查看当前容器的重启规则:
如果返回结果为docker inspect my_container --format='{{.HostConfig.RestartPolicy.Name}}'always或unless-stopped,只要主进程结束(无论正常/异常退出),Docker都会自动重启容器;如果返回on-failure,仅当退出码非0时重启,和你的现象不符可以排除。 - 第二步:查看容器历史启停记录
执行以下命令查看容器的重启次数,以及每次启动、退出的时间戳和对应退出码:
对比每次运行的时长,如果和你Python脚本单次抓取任务的执行时长吻合,基本可以判定是脚本执行完成后正常退出,触发了重启策略。# 查看累计重启次数 docker inspect my_container --format='{{.State.RestartCount}}' # 查看多轮启停的时间、退出码记录 docker inspect my_container | grep -E '(ExitCode|StartedAt|FinishedAt)' - 第三步:抓取全量运行日志确认主进程行为
你之前没查到报错大概率是Python日志缓冲未刷入就退出导致的,首先修改容器启动命令,给Python加上-u参数关闭标准输出缓冲:
再执行以下命令抓取所有历史日志,包括之前重启轮次的输出:# 原CMD如果是 python your_script.py,修改为 CMD ["python", "-u", "your_script.py"]
也可以实时监控日志,确认脚本运行结束后有没有正常的退出日志输出:docker logs --since 48h my_containerdocker logs -f --tail 100 my_container - 第四步:实时监控容器事件定位重启触发源
如果你怀疑是外部操作(比如GCE实例的健康检查、Docker daemon的异常调度)触发的重启,可以执行以下命令实时监控容器的所有生命周期事件:
容器重启时会输出退出信号、触发动作、发起方等信息,可以直接定位重启原因。docker events --filter 'container=my_container'
对应场景的常见根因
你运行的是定时抓取类Python脚本,大概率是脚本本身为单次执行逻辑,跑完所有抓取任务后就正常退出,搭配了always类重启策略就会反复重启。如果要避免这个问题,要么把脚本修改为常驻进程(比如加死循环定时触发抓取),要么把重启策略改为on-failure仅异常退出时重启。
内容的提问来源于stack exchange,提问作者anddt
相关产品推荐
相关产品推荐

