Docker Desktop 卡在 Starting the Docker Engine 与后台 500:E_ACCESSDENIED 完整排查笔记
一、故障现象
- Docker Desktop 打开后永远停在 Starting the Docker Engine… 转圈
- Troubleshoot / 后台 info 接口返回 500 Internal Server Error
docker version只返回 Client 段,Server 段报500 ... check if the server supports the requested API version- 当天刚开机就失败,重启 Docker、重启 WSL 均无效
- 最初怀疑是代理导致
二、环境信息
| 项目 | 值 |
|---|---|
| 系统 | Windows 11 23H2(22631) |
| Docker Desktop | 4.88.1 / Engine 29.7.2 |
| WSL | 2.6.3.0 / kernel 6.6.87.2-1 |
| 数据盘 | docker_data.vhdx(2.43 GB) |
| 特殊配置 | C:\Users\<用户>\AppData\Local\Docker\wsl 被缓存搬移工具 junction 到 F:\someCache\Users\<用户>\AppData\Local\Docker\wsl |
| 代理 | 系统代理关闭;存在 Mihomo TUN 虚拟网卡(非本次原因) |
三、关键日志
后端日志位置:%LOCALAPPDATA%\Docker\log\host\com.docker.backend.exe.log
[com.docker.backend.exe.wslexec][E] c:\windows\system32\wsl.exe --mount --bare --vhd <home>\appdata\local\docker\wsl\disk\docker_data.vhdx failed: exit status 0xffffffff (stdout: "无法将磁盘“\\?\F:\someCache\Users\1\AppData\Local\Docker\wsl\disk\docker_data.vhdx” 附加到 WSL2: 拒绝访问。 错误代码: Wsl/Service/AttachDisk/MountDisk/HCS/E_ACCESSDENIED")
[com.docker.backend.exe.engines][W] attempting recovery from engine failure: starting engine: engine linux/wsl failed to start: starting WSL engine: bootstrapping main distribution ...之后 Docker 每 1.5 秒重试一次 --mount,无限循环;引擎状态永远停在 starting,Dashboard 因此一直转圈,后台 HTTP API 对未就绪引擎返回 500。
四、排查过程(证据链)
-
排除代理:实测系统代理关闭(
ProxyEnable=0)、WinHTTP 直连。代理/TUN 只可能影响镜像拉取与 DNS,不可能让引擎卡在启动阶段;且报错发生在 WSL 服务层(Wsl/Service/AttachDisk),与网络无关。 -
WSL 本体正常:
wsl -l -v正常列出 Ubuntu-24.04 与 docker-desktop;docker-desktop发行版本身能启动(状态 Running)。说明坏的不是 WSL,而是数据盘挂载这一步。 -
500 是结果不是原因:引擎未 running → 后端 API 500。修好引擎,500 自然消失。
-
同目录对比两个 vhdx 的属主(决定性线索):
- 能挂载的发行版盘
wsl\main\ext4.vhdx→ 属主 当前用户 - 挂不上的数据盘
wsl\disk\docker_data.vhdx→ 属主 BUILTIN\Administrators
ACL 表面看一切正常(SYSTEM/Administrators 完全控制、Authenticated Users Modify),但 WSL 2 的
--mount(AttachDisk)会对发起调用的用户做授权校验;普通用户令牌不满足校验 → E_ACCESSDENIED。Docker Desktop 后端正是以普通用户身份执行wsl.exe --mount。 - 能挂载的发行版盘
-
社区同款案例佐证:Docker 论坛、微软 Q&A、microsoft/WSL#14544 均有相同错误码;论坛解法“用管理员手动
wsl --mount就能挂上”正说明是调用者授权问题。 -
修复验证:改属主后,同一行
wsl.exe --mount命令不再报错,引擎 5.4 秒进入 running(此前无限重试)。
五、根因
docker_data.vhdx 被缓存搬移工具以管理员身份移动后,属主变成了 Administrators。WSL 2 的 --mount --bare --vhd 路径会校验调用用户对该 vhdx 文件的权限,普通用户因不满足校验被拒,返回 Wsl/Service/AttachDisk/MountDisk/HCS/E_ACCESSDENIED,引擎永远无法启动。
两个易误导的表象:
- 报错路径显示
\\?\F:\someCache\...(junction 解析后的真实路径),但 junction 本身不是元凶——同目录下发行版盘挂载正常; - 文件 ACL 里 SYSTEM/Administrators 都有完全控制,看似“权限没问题”——但 WSL 校验的是调用者,不是 SYSTEM。
六、修复步骤(管理员 PowerShell)
# 1) 夺取属主takeown /f "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx"
# 2) 给当前用户完全控制(这一步是决定性修复)icacls "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx" /grant "$env:USERNAME:(F)" /Q
# 3) 顺手恢复 Docker 提权助手服务(负责 Hyper-V 后端等其他提权操作)Start-Service com.docker.service
# 4) 重启 Docker Desktop,验证docker version # 应出现 Server 段docker ps # 容器列表数据零丢失:本案例中 redis(sub2api-redis)与 postgres(sub2api-postgres)两个容器及全部镜像完好,修好后自动恢复运行。
七、顺带发现的两个坑
wsl --update永远卡在“正在检查更新”:Windows Update 服务(wuauserv)被停用,更新检查无限挂起。需要先Start-Service wuauserv再更新。WSL 2.6.3 本身可用,非必要不用更新。- 代理与 Docker 的关系(回答最初怀疑):
- 系统代理 / HTTP 代理不会导致引擎无法启动;
- 但 Clash / Mihomo 等 TUN 全局模式会劫持
vEthernet (WSL)虚拟网卡,导致引擎内 DNS 解析失败、拉镜像超时——那是另一类故障; - 正确姿势:Docker Desktop → Settings → Resources → Proxies 里配置
http://127.0.0.1:<端口>。
八、预防建议
-
用搬移工具把 AppData 缓存挪到其他盘后,检查关键文件属主:
Terminal window Get-Acl "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx" | Select-Object Owner, AccessToString -
WSL 相关 vhdx 应保持:属主为当前用户、未压缩(
compact /Q <file>检查,压缩属性同样会触发 HCS E_ACCESSDENIED)、不被云同步/备份软件接管; -
遇到
E_ACCESSDENIED先查属主与 ACL,不要急着重装 Docker / WSL 或删数据盘(删了镜像容器全没)。
九、参考
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!





















