退出码137表示容器被SIGKILL(信号9)强制终止,最常见原因为Linux内核OOM Killer触发:若docker inspect显示"OOMKilled": true,则是容器超内存limit被cgroup杀;若为false,则多因宿主机全局OOM或节点MemoryPressure驱逐。
windows 容器本身不直接运行 linux 内核的 oom killer(该机制属于 linux 内核),但当你在 windows 上使用 docker desktop 运行 linux 容器(默认模式),或通过 wsl2 后端 托管容器时,底层实际是 linux 内核 —— 此时容器仍会受 linux oom killer 影响。而若运行的是 windows 容器(如 nanoserver、servercore 镜像),则不存在传统 oom killer,但会因内存耗尽触发进程被 windows 系统强制终止(exitcode 137 或 oomkilled: true 字段可能误显,需结合上下文判断)。
确认是否真为 OOM 导致退出
别急着调参数,先验证是不是内存问题:
- 运行
docker inspect,检查输出中:
•"State.OOMKilled": true→ 明确由 Linux 内核 OOM Killer 终止(仅适用于 Linux 容器);
•"State.ExitCode": 137→ 强烈提示被 SIGKILL 终止,90% 是 OOM;
•"State.ExitCode": 143→ 收到 SIGTERM,通常是手动 stop 或健康检查失败,非 OOM。 - 查看宿主机资源:打开 Windows 任务管理器 → “性能”页 → 查看“内存”使用率是否长期 ≥95%,同时观察 WSL2 虚拟机(如果启用)是否内存吃紧(可在 WSL 中执行
free -h)。 - 检查 Docker Desktop 设置:Settings → Resources → WSL Integration → 确认已启用对应发行版;并检查 Memory 限制(如设为 2GB 但容器申请 2.5GB,就会触发 OOM)。
针对 Linux 容器(WSL2/VM 后端)的 OOM 排查
这是最常见场景,本质是 WSL2 的 Linux 内核在杀进程:
-
查容器内真实内存压力:进入容器执行
cat /sys/fs/cgroup/memory/memory.usage_in_bytes和/sys/fs/cgroup/memory/memory.limit_in_bytes,若前者接近后者,说明触达限制。 -
看宿主机 dmesg 日志:在 PowerShell 中运行:
wsl -d docker-desktop sh -c "dmesg -T | grep -i 'killed process'"
若输出类似[Mon Jul 29 14:22:03 2026] Out of memory: Kill process 1234 (java) score 872...,即确认 OOM Killer 干的。 -
降低容器内存申请量:启动时加
--memory=1g --memory-swap=1g显式限制,避免无节制增长;对 Java 等应用,务必设置 JVM 堆上限(如-Xmx512m),否则默认可能占满容器内存限额。
针对原生 Windows 容器的内存异常退出
Windows 容器不会触发 Linux OOM Killer,但会因内存不足被 Windows 系统终止(表现为进程突然消失、事件日志报错):
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
- 打开 Windows 事件查看器 → Windows 日志 → 系统 → 筛选事件 ID
4101(容器服务日志)或搜索关键词“out of memory”、“failed to allocate”。 - 检查容器镜像是否兼容:某些旧版 Windows Server Core 镜像在 Win11 或新版 Docker Desktop 下存在内存管理缺陷,尝试切换至
mcr.microsoft.com/windows/nanoserver:ltsc2022等较新标签。 - 禁用不必要的 Windows 服务:在容器启动脚本中添加
sc config wuauserv start= disabled等命令,减少后台内存占用(尤其对 servercore 镜像有效)。
通用缓解与预防措施
无论哪种容器,以下操作能显著降低 OOM 风险:
- 给 Docker Desktop 分配足够内存:Settings → Resources → Memory → 建议设为物理内存的 50%~60%(如 16GB 主机设 8GB),避免 WSL2 抢占宿主机关键内存。
- 关闭 Windows 休眠和快速启动:这两项会锁定部分内存页,导致 WSL2 可用内存减少,PowerShell 管理员运行:
powercfg /h off。 - 定期清理构建缓存与悬空镜像:
docker system prune -a(谨慎执行),避免磁盘空间不足间接引发内存交换失败。 - 对关键容器启用健康检查 + 重启策略:
--health-cmd="exit 0" --health-interval=30s --restart=on-failure:3,避免单次 OOM 后彻底失联。










