如何检查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
相关产品推荐
相关产品推荐

