介绍
我目前正在尝试使用 dotnet 为多个平台自动构建 docker 映像。
我读过最好的方法是使用 docker buildx 命令。
我试图为 arm32 arm64 和 x64 设置它。x64 和 arm64 的构建使用此命令可以正常工作,但是我遇到了 arm32 的问题。这是我正在执行的命令:
docker buildx build -f DeveMazeGeneratorCore.Web/Dockerfile --platform linux/arm,linux/arm64,linux/amd64 -t devedse/devemazegeneratorcoreweb .
错误
我得到的错误是:
#17 [linux/arm/v7 build 5/8] RUN dotnet restore "DeveMazeGeneratorCore.Web/D...
272#17 0.254 A fatal error occurred, the folder [/usr/share/dotnet/host/fxr] does not contain any version-numbered child folders
273#17 ERROR: executor failed running [/bin/sh -c dotnet restore "DeveMazeGeneratorCore.Web/DeveMazeGeneratorCore.Web.csproj"]: exit code: 131
我已经在这里(https://github.com/dotnet/dotnet-docker/issues/1537#issuecomment-615269150)读到您显然无法在 64 位系统上构建 arm32 映像。有人可以解释为什么会这样吗?我的意思是我们正在使用 QEMU 来模拟 arm 对吗?
我可以通过创建一个基于 64 位映像构建的新 dockerfile 来解决这个问题,然后创建一个 arm32 位映像。像这样:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.8-buster-slim-arm32v7 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1.402-buster-arm64v8 AS build
WORKDIR /src
COPY ["DeveMazeGeneratorCore.Web/DeveMazeGeneratorCore.Web.csproj", "DeveMazeGeneratorCore.Web/"]
COPY ["DeveMazeGeneratorCore/DeveMazeGeneratorCore.csproj", "DeveMazeGeneratorCore/"]
RUN dotnet restore "DeveMazeGeneratorCore.Web/DeveMazeGeneratorCore.Web.csproj"
COPY . .
WORKDIR "/src/DeveMazeGeneratorCore.Web"
RUN dotnet build "DeveMazeGeneratorCore.Web.csproj" -c Release -o /app/build
FROM build AS publish
ARG BUILD_VERSION
ARG VER=${BUILD_VERSION:-1.0.0}
RUN dotnet publish "DeveMazeGeneratorCore.Web.csproj" -c Release -o /app/publish /p:Version=$VER
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DeveMazeGeneratorCore.Web.dll"]
使用 buildx 的想法是重用相同的 dockerfile。那么有没有另一种方法可以使用 buildx 来做到这一点?(例如条件检查或类似的东西)。或者有没有更新/更好的方法来解决这个问题?我还研究过在 buildx 中使用多个 Dockerfile,但找不到与此相关的任何内容。
从理论上讲,我可以使用 docker manifests 手动执行此操作并将它们全部推送到同一个标签,但是由于这似乎有点麻烦,而且每个人都建议 buildx 我宁愿使用它。查看我正在尝试构建的 github + github 操作: https ://github.com/devedse/DeveMazeGeneratorCore