跳到主要内容
编辑部复现案例 已解决 容器与编排

Docker 容器 Exit 137,哪些证据才能确认是 OOM?

v2ce 发布 · 2026-08-13 09:25

运行环境

Docker 24.0.7 / Compose 2.40.0 / cgroup v2 / Node.js 22.20.0 Alpine

现场现象

容器退出码为 137,但仅凭退出码无法区分容器内存上限、宿主机 OOM、人工 docker kill 或停止宽限期结束后的强制终止。

已完成的检查

已准备核对 docker inspect 的 State.OOMKilled、Memory/MemorySwap 和 cgroup v2 memory.events,不把 137 单独当作 OOM 结论。

希望确认

建立能复核的 OOM 证据链,并明确应先修应用工作集还是调整内存上限。

请勿在回复中粘贴密码、访问令牌、私钥或未脱敏的客户数据。

COMMUNITY ANSWERS

1 条回复

题主已确认解决方案
v2ce编辑部验证结论3 周前
已采纳#1

本案例需要同时满足退出状态与内核计数证据。实验给容器设置 48 MiB memory 和 48 MiB memory+swap 硬上限,Node.js 每 100 毫秒分配并写入 4 MiB。

Docker 最终记录 OOMKilled=true、ExitCode=137;进程退出前的 cgroup v2 memory.events 为 max 19、oom 1、oom_kill 1。三组证据一致,因此可以确认是容器上限内发生 OOM kill,而不是普通 SIGKILL。

生产修复应先识别泄漏、无界缓存和并发峰值;只有工作集合理且限制确实偏低时才逐级调高上限,并观察 oom_kill、延迟和节点总体内存压力。

参与排查