resource saver 模式仅在无容器运行时触发,空闲超时(默认30分钟)后释放wsl2内存缓存,不终止运行中容器;常见“容器消失”实为oom或compose重试导致,关闭该功能需在docker desktop设置中禁用或通过.wslconfig调整资源策略。

Resource Saver 模式不会停止正在运行的容器
它只在「没有任何容器运行」时才开始计时,一旦有 docker run 或 docker start 命令执行,Docker Desktop 会立刻退出该模式,所有资源恢复供应。你看到容器被“杀掉”,大概率是别的原因——比如 WSL2 内存耗尽触发了 OOM Killer,或者容器本身因健康检查失败被 Compose 自动重启。
Resource Saver 的真正触发条件是“空闲时长”
这个空闲,指的是从最后一个容器停止(docker stop 或自然退出)开始,到当前时间之间的时间间隔。它不看 CPU 使用率、不看内存占用、也不管你有没有打开 Docker Desktop 界面。
- 默认空闲阈值是
30 分钟,无法通过 UI 修改,只能靠 CLI 或配置文件间接影响(例如关闭 Resource Saver) - 如果你设置了
5 分钟,那只要连续 5 分钟没容器在跑,它就会进入低功耗状态 - 进入后,WSL2 虚拟机仍在运行,但内核会主动释放大量缓存页,
vmmemWSL进程内存占用会明显回落
为什么你感觉“容器被停了”,其实是 WSL2 配置和 Resource Saver 在打架
常见组合陷阱:
- 你设了
memory=2GB在.wslconfig,但同时又开了 Resource Saver —— 后者在空闲时进一步压缩可用内存,导致容器刚启动就因内存不足被内核干掉 - 你用
docker-compose up -d启动服务,但其中某个容器启动失败(比如端口冲突、依赖未就绪),Compose 默认策略是反复重试,而每次失败都算作“容器已停止”,容易意外满足 Resource Saver 的空闲判定 - macOS 上 Resource Saver 行为略有不同:它可能延迟唤醒虚拟机,造成
docker ps短暂无响应,误判为容器消失
想彻底关掉 Resource Saver?只能禁用,不能调成“永不”
Docker Desktop UI 里没有“关闭”开关,但你可以绕过它:
- Windows:在 PowerShell 中执行
wsl --shutdown,然后编辑%UserProfile%\.wslconfig,加上swap=0并确保memory不设得过小(否则 WSL2 会自动启用 swap 作为兜底,反而激活 Resource Saver 逻辑) - macOS:Settings → Resources → Advanced → 取消勾选
Enable Resource Saver(注意:该选项在较新版本中已移至 Settings → General →Automatically reduce resources when idle) - 最稳方案:保持 Resource Saver 开启,但把空闲阈值拉到最大(
60 分钟),同时用docker stats监控关键容器,避免依赖“永远在线”的假定
真正容易被忽略的是:Resource Saver 是全局开关,它不管你是开发调试还是 CI 构建,只要空闲就生效。如果你本地常驻一个 postgres 容器做开发数据库,又习惯下班前不关机,第二天早上很可能发现连接不上——不是容器挂了,是 WSL2 刚从深度节电里醒来,网络栈还没完全初始化完。











