WSL中可直接使用docker build,但需开启Docker Desktop的WSL集成、构建上下文须位于WSL原生文件系统(不可用/mnt/c/路径),且需正确配置镜像源与多阶段构建阶段名;执行docker --version和docker info可验证环境是否就绪。

WSL 里能直接用 docker build,但前提是 Docker Desktop 的 WSL 集成必须打开,且构建上下文不能跨到 /mnt/c/ 等 Windows 路径——否则会卡住或报 permission denied。
确认 docker 命令在 WSL 终端里可用
不是看 Docker Desktop 图形界面有没有绿点,而是进 Ubuntu 终端后执行:
docker --version
如果报 command not found 或 Cannot connect to the Docker daemon,说明集成没生效。常见原因有三个:
- WSL 发行版没在 Docker Desktop 的
Settings → Resources → WSL Integration里勾选(哪怕只勾一个也要手动开) - 勾选后没点
Apply & Restart,或者点了但没重启 WSL:在 PowerShell 里运行wsl --shutdown再重开终端 - 发行版名字带空格或特殊字符(比如
Ubuntu-22.04 (Dev)),Docker Desktop 有时识别失败,建议用wsl -l -v看实际名称,再对应勾选
构建命令必须在 WSL 文件系统内执行
你不能在 /mnt/c/Users/xxx/project 这种路径下运行 docker build,即使它看起来能读取文件,也会在 COPY 阶段失败或极慢。正确做法是把项目复制或软链接到 WSL 根文件系统里,例如:
cp -r /mnt/c/Users/alex/project ~/myapp- 或用 VS Code 的 Remote-WSL 插件直接在
~/myapp里编辑和构建 - 构建命令始终从项目根目录(含
Dockerfile的目录)执行:docker build -t myapp:dev .
注意结尾的 . 是当前目录,不是 Windows 下习惯的 ./ —— WSL 里 . 就够了。
构建失败时先看 docker info 和镜像源配置
很多“拉不到基础镜像”的问题,其实不是网络不通,而是没配国内镜像源。执行:
docker info | grep "Registry Mirrors"
如果没输出,或者输出的是空数组 [],说明镜像加速没生效。此时不要去改 /etc/docker/daemon.json(WSL 里没独立 docker service),而应该:
- 打开 Docker Desktop → Settings → Docker Engine
- 在 JSON 配置里加
"registry-mirrors"字段,例如:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
- 点击
Apply & Restart,再回到 WSL 终端验证
这个配置是 Docker Desktop 全局生效的,比在 WSL 里单独装 docker.io 更稳定,也避免了 sudo service docker restart 失败的问题。
多阶段构建别漏掉 --from= 的阶段名
WSL + Docker Desktop 对多阶段构建支持很好,但容易写错阶段引用。比如:
FROM golang:1.23-alpine AS builder COPY . . RUN go build -o /app . FROM alpine:latest COPY --from=builder /app /usr/local/bin/app CMD ["/usr/local/bin/app"]
关键点:
-
AS builder后面的名字必须和--from=builder完全一致(区分大小写) - 如果用了
ARG动态指定基础镜像,--from=不能引用ARG,只能引用AS定义的阶段名 - 构建时加
--progress=plain能看到每一步耗时,方便定位卡在哪一阶段
最后提醒一句:WSL 里构建的镜像,会直接出现在 Docker Desktop 的 Images 列表里,不需要 docker save 导出——它本来就是同一个引擎。











