Mac M1构建.NET 6 Dockerfile成功,Windows 10 WSL2构建失败如何解决?
问题解决方案
根本原因
你编写的多阶段Dockerfile存在逻辑疏漏:第二阶段的COPY指令默认从**本地构建上下文(执行docker build命令的当前目录)**拉取文件,而非从前置SDK构建阶段的镜像内部拉取文件。
Mac环境构建成功属于巧合:你此前在本地开发时手动执行过dotnet publish命令,本地已存在bin/Release/net6.0/publish目录,构建时直接复用了本地生成的文件;而WSL2环境下没有提前生成过该本地目录,因此触发文件不存在的报错。
修复后的Dockerfile
给第一阶段构建设置别名,第二阶段COPY时明确指定从构建阶段拉取文件,同时修正相对路径跳转的潜在问题,参考配置如下:
# 给SDK构建阶段设置别名build-env FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env # 固定构建工作目录,避免相对路径混乱 WORKDIR /src COPY *.csproj ./ RUN dotnet restore COPY *.cs ./ COPY Properties ./ # 明确指定发布输出目录,屏蔽不同环境的默认路径差异 RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/runtime:6.0 WORKDIR /app # 明确从build-env构建阶段的输出目录复制文件 COPY --from=build-env /src/out . ENTRYPOINT ["dotnet", "app.dll"]
修复后执行以下命令构建即可,跨架构场景(M1构建x64镜像)可补充--platform参数:
# 普通构建 docker build -t counter-image . # 跨架构构建x64镜像 docker build --platform linux/amd64 -t counter-image .
可选排查步骤
如果修改后仍存在问题,可按以下步骤定位:
- 单独验证构建阶段是否正常:注释掉Dockerfile中runtime及之后的所有行,执行
docker build -t test-build .,构建完成后执行docker run --rm test-build ls /src/out,如果能正常列出发布后的dll文件说明构建阶段无异常 - 确认WSL2环境的Docker已开启目录挂载权限,避免构建上下文读取失败
- 确认执行构建命令的工作目录为项目根目录,且Dockerfile位于该目录下,不要在子目录下执行构建
内容的提问来源于stack exchange,提问作者ff8mania
相关产品推荐
相关产品推荐

