元数据
| id | docker-container-oom-killed | 收录 | 2026-08-31 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 容器与 WSL |
| 适用工具 | docker · 外部工具 | ||
症状
```
$ docker ps -a
oomdemo2 ... Exited (137) 4 seconds ago
$ docker inspect oomdemo2 --format "{{.State.OOMKilled}} {{.State.ExitCode}}"
true 137
# 内核侧(dmesg 原文节选)
oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-...scope,task=python3,pid=24719,uid=0
Memory cgroup out of memory: Killed process 24719 (python3) total-vm:273380kB, anon-rss:64640kB
```
特征:容器 exit 137 + OOMKilled=true;应用日志里没有报错(SIGKILL 不经过应用);`docker stats` 用量贴着 LIMIT。
原因
容器进程累计内存超过 cgroup(`memory.max`)限制,内核 OOM killer 在 cgroup 内杀进程,exit code = 137(SIGKILL)。不设 `-m` 则无上限。默认 `--memory-swap` = 2×`--memory`。
解法
1. `docker inspect` 确认 OOMKilled=true;
2. `docker stats` 量化用量,`dmesg | grep oom-kill` 取内核证据;
3. 设/调 `-m`(compose `mem_limit`),必要时调 `--memory-swap`;
4. 治本:按运行时模型配(Java MaxRAMPercentage / Node max-old-space-size / Python 大分配)并重建容器;
5. 验证 OOMKilled=false、stats 有富余。
验证证据
- 本机实测复现(2026-08-31,WSL 定制预构建版,docker 29.1.3):
- 基线:无限制容器分配 256MB 成功(`alloc ok 268435456`);
- `-m 64m` + 分配 256MB → 进程被杀,`docker run` 退出码 137;`docker inspect` → `OOMKilled=true ExitCode=137`;
- dmesg 原文:`oom-kill:constraint=CONSTRAINT_MEMCG,...,task=python3,pid=24719` + `Memory cgroup out of memory: Killed process 24719 (python3) total-vm:273380kB, anon-rss:64640kB`;
- `-m 128m` 容器内 `cat /sys/fs/cgroup/memory.max` = 134217728(128MiB);`docker stats` 显示 `100.1MiB / 128MiB 78.22%`;
- `--memory-swap` 默认=2×memory 语义按 docker help 文档核对。
- 实测复现日志(2026-08-31)
来源与证据
素材来源:本机实测复现(2026-08-31,Docker 域缺口 #20)
验证证据:Evidence details kept locally (2026-08-31)