Docker Compose 启动容器报错 Exit Code 137 内存不足怎么解决

文章导读
Docker 容器退出代码 137 通常意味着进程收到了 SIGKILL 信号,在 2022 年 8 月 22 日的技术文档中明确指出,当"OOMKilled"状态为 true 且退出码为 137 时,代表内存不足导致容器被系统杀死。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

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 后,容器启动恢复正常。

Docker Compose 启动容器报错 Exit Code 137 内存不足怎么解决

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。

Docker Compose 启动容器报错 Exit Code 137 内存不足怎么解决

参考来源

来源: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 日)