在 ARM 上构建 X86 docker 镜像?

jwi*_*mer 8 docker .net-core asp.net-core multiarch

我已经在构建.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"]
Run Code Online (Sandbox Code Playgroud)

Ste*_*han 5

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

Buildx - 用于跨平台镜像构建

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

在设置 buildx 并配置它之后。你可以运行:

docker buildx build \
  --platform linux/amd64,linux/386,linux/arm/v7 \
  --push \
  -t docker_user/docker_image:latest \
  .
Run Code Online (Sandbox Code Playgroud)

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

什么buildx呢,它模拟目标平台和执行你经常泊坞窗文件中的所有步骤,如果该平台上运行。Buildx 还标记了图像、-t参数。并将其推送到选择的 docker 注册表,如果您指定--push.

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

在 docker 编译中

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

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

要求

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

见实战

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