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

如何检查Docker容器是否停止或异常退出?仅过滤ExitCode=137可行吗?

关于容器停止/异常退出的判断逻辑

兄弟,只靠State.ExitCode == 137来筛选停止或异常退出的容器肯定不够全面,这只能覆盖一小部分场景,我给你掰扯清楚:

1. 先搞懂137退出码的含义

137其实是128 + 9,其中9对应Linux的SIGKILL信号,这个退出码只会在两种典型场景出现:

  • 容器被手动强制杀死(比如执行docker kill命令)
  • 容器进程被系统的OOM Killer(内存不足时的进程杀手)干掉

这只是容器异常退出的其中一种情况,远不是全部。

2. 哪些停止/异常退出的容器不会触发137?

  • 正常停止的容器:比如用docker stop命令优雅终止容器,这时候容器的ExitCode是0,State.Running为false,属于正常停止,但完全不符合137的条件
  • 进程自身崩溃退出:容器里的应用程序自己报错崩溃,退出码可能是1、2、127等非0值(具体取决于程序逻辑),这些都属于异常退出,但ExitCode不是137
  • 优雅终止失败后被杀死:如果docker stop等待超时后强制杀死容器,这时候ExitCode才会是137,但如果优雅终止成功,就是0

3. 正确的判断方式应该结合State里的多个字段

要全面覆盖所有“停止或异常退出”的场景,应该结合State.Running和State.ExitCode两个核心字段:

  • 先判断State.Running == false:确认容器已经处于停止状态
  • 再看State.ExitCode:
    • ExitCode为0:容器是正常停止
    • ExitCode非0:容器属于异常退出(包含137,也包含其他所有非0退出码)

另外,State.Status字段也能直接看出容器状态,比如exited表示已停止,running表示运行中,结合这个字段也能快速判断。

给你个用jq工具快速解析的示例命令:

docker inspect <container-id/name> | jq '.[0].State | {Running: .Running, ExitCode: .ExitCode, Status: .Status}'

这样就能清晰看到容器的运行状态、退出码,进而准确判断是正常停止还是异常退出啦。

内容的提问来源于stack exchange,提问作者asdf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:15