在 Mac M1 上构建 Dockerfile 成功,在 Windows 10 WSL 2 上失败

Posted

技术标签:

【中文标题】在 Mac M1 上构建 Dockerfile 成功,在 Windows 10 WSL 2 上失败【英文标题】:Builiding Dockerfile succeed on Mac M1, fails on Windows 10 WSL 2 【发布时间】:2021-12-26 07:12:33 【问题描述】:

将我过去做的应用程序容器化后,我开始在我的 Mac M1 上工作并创建了以下 Dockerfile(如您所见,非常简单):

FROM mcr.microsoft.com/dotnet/sdk:6.0

COPY *.csproj ./
RUN dotnet restore

COPY ../*.cs ./
COPY ../Properties ./

RUN dotnet publish -c Release

FROM mcr.microsoft.com/dotnet/runtime:6.0

COPY ./bin/Release/net6.0/publish app/
WORKDIR /app

ENTRYPOINT ["dotnet", "app.dll"]

启动最简单的

docker build -t counter-image -f Dockerfile .

它在 MacM1 中完美运行,在 Windows 10 中失败。 当我运行 docker build -t counter-image -f Dockerfile .

#1 [internal] 从 Dockerfile 加载构建定义 #1 sha256:a5c8a0c34c743f255ebdc15d65bfbbe5094a37db3462015427300b5d8afdb80e #1 传输 dockerfile: 403B 完成 #1 完成 0.1 秒

#2 [内部] 加载 .dockerignore #2 sha256:dc1169a26a22674179859bc7bb3820723365424bb8804c7917733b3b74ec5d65 #2 传输上下文:2B 完成 #2 完成 0.1 秒

#3 [internal] 为 mcr.microsoft.com/dotnet/runtime:6.0 加载元数据 #3 sha256:0128d5218b10a50bf55970db7c113f09503205e2b2ada4931bb5d0c6628fdd2a #3 完成 1.2 秒

#5 [internal] 加载构建上下文 #5 sha256:0f49ce22f840bcf956513309e49cda3c26b83cb92b6e3f539b463beb14fb36e7 #5 完成 0.0 秒

#4 [stage-1 1/3] FROM mcr.microsoft.com/dotnet/runtime:6.0@sha256:dbf2ee47aeb7cc078d1351ef961913296d9044db8928b3d1cbb88d7d3e87cccb #4 sha256:2aacc73d23873adb384695e176a97f35524a7a10087c170e336161af3a1b4ce3 #4 解决 mcr.microsoft.com/dotnet/runtime:6.0@sha256:dbf2ee47aeb7cc078d1351ef961913296d9044db8928b3d1cbb88d7d3e87cccb 0.1秒完成 #4 sha256:dbf2ee47aeb7cc078d1351ef961913296d9044db8928b3d1cbb88d7d3e87cccb 2.17kB / 2.17kB 完成 #4 sha256:b534d6bba13c1654a13497dfcb04ad0b398772b5d1da0e5bec5e0a3e38e15ccb 1.16kB / 1.16kB 完成 #4 sha256:8b872fde0fc7d2e58dd4f04ad53f21d27043640978dd7730add604f9b58ed207 2.80kB / 2.80kB 完成 #4 取消

#5 [internal] 加载构建上下文 #5 sha256:0f49ce22f840bcf956513309e49cda3c26b83cb92b6e3f539b463beb14fb36e7 #5 传输上下文:25B 完成 #5 完成 0.1 秒

#6 [stage-1 2/3] COPY ./bin/Release/net6.0/publish MindsphereConfigurationMover/ #6 sha256:434ed7ed1150d04fac20d05feeb2d63aa5bdcf9cf63821709aa8091d48422119 #6 错误:“/bin/Release/net6.0/publish”未找到:未找到

[stage-1 2/3] COPY ./bin/Release/net6.0/publish MindsphereConfigurationMover/: ------ 无法计算缓存键:“/bin/Release/net6.0/publish” not found: not found

看起来它无法获取 sdk/runtime,因此以下发布失败,但对我来说意义不大。

有什么建议吗?

【问题讨论】:

【参考方案1】:

我猜您希望 COPY ./bin/Release/net6.0/publish app/ 行从之前在 Dockerfile 中构建的项目中复制已发布的应用程序。但这不是它实际在做的事情。它试图从容器外部的本地文件系统(您的构建上下文位置)的bin/Release/net6.0/publish 复制。所以,这个目录很可能存在于您的 M1 Mac 上,而不是您的 Windows 机器上。

它尝试从本地文件系统复制的原因是因为您没有在 COPY 指令中指出它应该从 Dockerfile 阶段复制。这可以使用以下语法来完成:COPY --from=<stage-name> <source-path> <destination-path>。为了引用阶段名称,您还需要声明阶段名称,这在此 Dockerfile 中也没有完成。您要参考的阶段是使用sdk 图像的阶段。

这是建议使用的 Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

COPY *.csproj ./
RUN dotnet restore

COPY ../*.cs ./
COPY ../Properties ./

RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/runtime:6.0

WORKDIR /app
COPY --from=build /app .

ENTRYPOINT ["dotnet", "app.dll"]

您可以在https://github.com/dotnet/dotnet-docker/tree/main/samples 看到演示此模式的 .NET Dockerfile。

【讨论】:

以上是关于在 Mac M1 上构建 Dockerfile 成功,在 Windows 10 WSL 2 上失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac M1 上 React Native ios 构建失败

如何在 M1 Mac 上运行 querydsl 项目测试?

Docker 在 M1 Mac arm64架构上构建 amd64镜像。

在 M1 Mac 上的 Azure Data Studio 中构建 SQL Server 数据库项目真的不可能吗?

【M1芯片Mac】Nuxt构建太慢

M1 mac 上的 Android 平台工具