退出码137表示容器被sigkill强制终止,大概率因oom killer触发;需依次确认oomkilled标记、检查内存限制与用量、排查/dev/shm占用、设置oom_score_adj优先级。

容器突然退出、退出码为137,大概率是被内核OOM Killer强制终止了。排查不能只看宿主机剩多少内存,关键要确认容器自身是否越界、哪里越界、为什么越界。
第一步:确认确实是 OOM 导致退出
别猜,直接查证据:
- 运行 docker inspect 容器名 --format='{{.State.OOMKilled}}',返回 true 就是铁证
- 再看退出码:docker inspect 容器名 --format='{{.State.ExitCode}}',137 是 SIGKILL 的标准码,和 OOM 强相关
- 查系统日志:dmesg -T | grep -i "killed process",会明确打出被杀进程名、内存用量(如 anon-rss、total-vm)和时间戳
第二步:检查容器内存配置与实际使用
硬限制设没设、设多少、用到什么程度,三者缺一不可:
- 查限制值:docker inspect 容器名 --format='{{.HostConfig.Memory}}',返回 0 或空说明没设限,风险极高
- 查实时用量:docker stats --no-stream 容器名,重点关注 MEM USAGE / LIMIT 比值,持续 >95% 就危险
- 查历史峰值:cat /sys/fs/cgroup/memory/docker/$(docker inspect -f '{{.Id}}' 容器名)/memory.max_usage_in_bytes,换算成 MB 看是否贴近 limit
第三步:盯住 /dev/shm 这个“隐形炸弹”
很多 OOM 不是主内存爆了,而是 /dev/shm 撑满了——Chrome、PyTorch、PostgreSQL、Puppeteer 都爱往这儿猛写,默认仅 64MB:
- 进容器执行:df -h /dev/shm,使用率超 80% 就要警惕
- 启动时补上:--shm-size=1g(推荐起步值),K8s 对应 emptyDir: { medium: Memory, sizeLimit: 1Gi }
- 临时验证:容器内运行 ls -lh /dev/shm,看有没有异常大文件或大量小文件堆积
第四步:分清轻重缓急,防止核心服务被误杀
资源紧张时,内核按优先级选进程开刀。不设保护,Redis、数据库可能比日志压缩任务先挂:
- 启动时加参数:--oom-score-adj=-500(保命级),或 --oom-score-adj=300(可牺牲级)
- 进容器验证:docker exec 容器名 cat /proc/1/oom_score_adj,必须等于设定值才生效
- 注意:--oom-score-adj 只在竞争时起作用,不能替代 --memory 硬限制











