【问题标题】:Build X86 docker image on ARM?在 ARM 上构建 X86 docker 映像?
【发布时间】:2020-10-16 22:23:35
【问题描述】:

我已经在构建 .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"]

【问题讨论】:

标签: docker asp.net-core .net-core multiarch


【解决方案1】:

如果我正确理解您的问题,您有一台运行管道的 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 参数。如果您指定 --push,则将其推送到选择的 docker 注册表。

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

在docker编译中

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

按照instructions here创建所需的dockerfile。

要求

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

见效

您还有一个github action 用于在 github 运行器中安装 buildx。我将它用于我的几个库,请参阅此 workflow file 或结果 here

【讨论】:

  • 我知道 buildx,但我认为这只适用于从 x86 编译 ARM,反之则不行。将测试它!
  • 根据this page 有人在做,所以我认为应该可以。
  • 我还不能让它工作,但这篇文章很有希望。我在它被浪费之前给你赏金。感谢您为我指明正确的方向。
猜你喜欢
  • 2022-06-14
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2021-06-16
  • 2019-03-25
  • 2020-05-26
  • 2013-08-13
相关资源
最近更新 更多