10

我已经在构建 .NET Core 应用程序的ARM设备上设置了构建管道。构建管道的最后一步是将编译后的 .NET Core 应用程序存储在 docker 映像中。

是否可以将应用程序存储在X86的 .NET Core 运行时映像中?

我希望 .NET Core 应用程序不关心系统架构,只要部署了 .NET 框架。并且那个 docker 不需要启动 X86 镜像来生成新的镜像:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

COPY /my-application/build/ /app/

EXPOSE 80/tcp

WORKDIR /app
ENTRYPOINT ["dotnet", "app.dll"]
4

1 回答 1

8

如果我正确理解您的问题,您有一台运行管道的 ARM 机器,并且您希望它同时编译图像ARMx86图像?

Buildx - 用于跨平台镜像构建

你当然可以。您可以使用buildx为您管理交叉编译。所以继续安装buildx

设置好 buildx 并进行配置后。你可以运行:

docker buildx build \
  --platform linux/amd64,linux/386,linux/arm/v7 \
  --push \
  -t docker_user/docker_image:latest \
  .

由于基本映像,这将适用于您想要的每个平台。您可以更改要为其构建的平台。

buildx的作用是模拟目标平台并执行常规docker文件中的所有步骤,就像在该平台上运行一样。Buildx 还标记了图像、-t参数。并将其推送到选择的 docker 注册表,如果您指定--push.

实际上,它会为每个平台推送一个图像以及一个加入这些图像的清单文件。如果其他 docker 客户端想要运行该映像,则会加载清单并选择所需的平台。

在 docker 编译中

为此,您需要在 docker 管道中编译映像。无论如何都建议这样做,因为在本地编译它然后将其复制到容器中会产生不同的图像,具体取决于构建图像的机器上安装的软件。

按照此处的说明创建所需的 dockerfile。

要求

为此,基础镜像还必须支持多种架构。您可以在 docker 注册表中检查这一点。dotnet 核心映像就是这种情况。但是,如果您的基础映像不支持该平台,它可能无法正常工作。但是,重新编译整个映像应该可以工作(只要基础映像支持该平台)。

看实际

您还有一个用于在 github 运行器中安装 buildx 的github 操作。我将它用于我的几个库,请参阅此工作流文件此处的结果

于 2020-07-08T10:44:38.893 回答