Docker 容器退出代码 137 通常意味着进程收到了 SIGKILL 信号,在 2022 年 8 月 22 日的技术文档中明确指出,当"OOMKilled"状态为 true 且退出码为 137 时,代表内存不足导致容器被系统杀死。
原因分析
Exit Code 137 的计算方式为 128 + 9,其中 9 代表 SIGKILL 信号。根据 2025 年 3 月 10 日的故障分析,当宿主机内存资源不足时,Linux 内核的 OOM Killer 机制会优先杀死占用内存最大的进程以释放空间。若容器未设置内存限制,默认可能消耗过多资源,触发宿主机的保护机制,导致进程被强制终止。
解决方案
1. 确认 OOM 状态
执行docker inspect <container-id>命令,检查 State 字段。2022 年 11 月 14 日的案例显示,若"OOMKilled": true,则确认为内存不足;若为 false,则需排查信号处理问题。
2. 设置内存限制
在 docker-compose.yml 中为服务添加mem_limit参数。2020 年 10 月 13 日的实践建议 Java 一般服务限制 300m 最低,Apollo 服务限制 400m,例如配置mem_limit: 400m。
3. 扩容宿主机资源
若限制内存后仍报错,需增加宿主机配置。2020 年 8 月 20 日的 ELK 部署案例中,将虚拟机资源从 CPU 1C 内存 2GB 修改为 CPU 1C 2 线程 内存 4GB 后,容器启动恢复正常。
4. 清理无用资源
执行docker system prune -a删除所有 unused 镜像释放空间,该操作在 2022 年 3 月 8 日的资料中被推荐用于缓解内存压力。
注意事项
1. 退出码 137 不一定都是 OOM:2022 年 11 月 14 日的反馈指出,即使"OOMKilled": false且内存充足(如分配 6GB),容器仍可能返回 137,这可能是因为应用未正确处理 SIGTERM 信号。
2. 查看系统日志:2023 年 2 月 23 日的排查指南强调,当 OOMKilled 为 false 时,需要通过查看系统dmesg日志来确认是否有 oom 记录。
3. 版本兼容性:2025 年 3 月 16 日的环境预检要求 Docker 版本至少在 19.03 及以上,操作系统建议 Ubuntu 20.04,内存至少 4GB。
参考来源
来源:51CTO 博客 - docker 137 错误处理_mob649e8168f1bb 的技术博客(2025 年 3 月 10 日)
来源:CSDN - ELK 学习笔记之 Docker Container exited with code 137(截至 2020 年 8 月 20 日)
来源:GitHub/技术社区 - 没有 OOM 异常时 Docker-compose 退出代码为 137(2022 年 11 月 14 日)
来源:技术文档 - docker-内存不足导致容器异常退出时怎么办(2022 年 8 月 22 日)