在非ARM架构上运行docker build时,能否构建包含ARM可执行文件的Docker镜像?

57次阅读
没有评论

问题描述

在x86架构的Windows笔记本上构建了一个Docker镜像,用于在ARM架构(Raspberry Pi 4)上作为容器运行。然而,在Dockerfile中构建时,会得到一个x86可执行文件。尽可能地,包括库和应用程序的构建都被推迟到容器实际在Pi上运行时。然而,这似乎很荒谬,因为必须每次容器运行时都进行构建(可能在许多Pi上运行)。毫无疑问,这也不必要地增加了容器的大小(这不太重要,但仍然令人恼火地不够优化)。

因此,总结一下,我想知道是否有一种方法可以在Dockerfile中运行gcc,并指示目标架构是ARM,而不是运行docker build的笔记本电脑上的x86架构。

解决方案

方案1

可以使用docker buildx来为多种架构构建镜像。Docker Buildx是Docker的一个工具,用于在多个架构上构建镜像。以下是使用Docker Buildx的基本步骤:

  1. 确保你的Docker版本支持Buildx。如果不支持,可以考虑升级Docker。
  2. 使用以下命令创建一个多架构构建器:
    sh
    docker buildx create --use
  3. 构建镜像时,使用--platform选项指定目标架构。例如,为ARM构建镜像:
    sh
    docker buildx build --platform linux/arm/v7 -t your_image_name:tag .

    在上面的命令中,linux/arm/v7表示ARMv7架构,你可以根据需要选择不同的ARM架构。

方案2

另一种方法是在Docker容器内使用qemu进行交叉编译。QEMU是一个支持多种架构的虚拟化工具,可以用于在不同架构之间运行二进制文件。以下是基本步骤:

  1. 在Dockerfile中添加qemu-user-static支持,以便在构建期间运行不同架构的二进制文件:
    Dockerfile
    FROM multiarch/qemu-user-static AS qemu
    ...
  2. 在Dockerfile的构建阶段中,使用COPYADD命令将适用于目标架构的二进制文件复制到镜像中。

请注意,使用这两种方法都需要适当配置构建环境和Dockerfile,以确保在目标架构上能够成功构建和运行二进制文件。

方案3

如果你希望尽可能简化操作,可以将二进制文件手动构建并放入Docker镜像中。在这种情况下,你可以在Dockerfile中使用COPYADD命令将二进制文件复制到镜像中。

综上所述,通过使用Docker Buildx、qemu交叉编译或手动构建二进制文件,你可以在非ARM架构上构建包含ARM可执行文件的Docker镜像,并在目标ARM架构上运行它。

正文完