【问题标题】:How do I make multi-arch Docker images? [closed]如何制作多架构 Docker 镜像? [关闭]
【发布时间】:2020-01-09 23:12:05
【问题描述】:

我为 CLI 实用程序创建了一个 Dockerfile,它在我的 Linux 笔记本电脑上运行良好。我尝试在安装了 Docker 的 Raspberry Pi 上运行容器,但它不起作用。

我知道无数公司创建镜像来支持多种架构,他们是如何做到的?

我想知道,因为我希望 CLI 的容器可以部署到 Raspberry Pi 以及我的 Linux 笔记本电脑上。

【问题讨论】:

标签: linux docker x86 raspberry-pi arm


【解决方案1】:

我知道其他公司创建图像来支持多种架构,他们是如何做到的?

快速的回答是,不可能创建一个支持多种架构的单一图像。但是,看起来好像一张图像可以满足多种架构,因为您实际上是在与a manifest file 进行交互。根据请求图像的 Docker 客户端,清单文件充当指向正确图像的指针。

例如,您可以在 x86_64 平台上运行 docker build(例如您的 Linux 笔记本电脑),然后在 armv7l 平台上再次运行 (例如 Raspberry Pi) em>,将创建​​两个完全不同的图像。应为生成的图像指定特定于平台的名称并推送到您的 Docker 图像存储库(例如hub.docker.com)。

完成后,您需要在 Docker CLI 中输入 enable experimental mode,并使用指向相应平台特定映像的平台中性名称 create and upload a manifest file

TL;DR 这三个命令可以解决问题(假设您在 x86_64 机器上工作)

docker manifest create <new-list-ref-name> <image-ref> [<image-ref>...]
docker manifest annotate <new-list-ref-name> <image-ref> --os linux --arch arm
docker manifest push <new-list-ref-name> [--purge]

注意:根据您是否使用多架构基础映像,您可能不需要docker manifest annotate 步骤。

注意:在推送清单文件(即docker manifest push ...)时,请务必使用--purge 选项;链接的文章中没有讨论它。不使用--purge,如果您打算使用稍后会重复使用的标签(例如latest),您会感到心痛。

【讨论】:

  • 您能否详细说明您的--purge 注释?如果不包含会怎样?
  • 没有--purge,您创建的清单文件将停留在您的本地主机上。当您引用特定且不可变的标签时,这可能是可取的,但是在制作可能会一遍又一遍地创建的通用标签(例如latest)时会产生冲突。如果没有--purge,您将很难正确更新清单以反映最新图像的当前哈希值,而且很难说出原因。我认为这类似于使用docker run--rm
  • 在哪些情况下需要指定--arch--os
  • 我不确定。事实上,当我发现多架构 FROM 图像没有必要时,我感到很惊讶。我只是想我会分享这个笔记。它肯定适用于明确说明的它们,所以如果可能的话,我可能只会提供参数。另外,如果您研究并发现更准确的答案,请在此处分享! :)
  • 您是清除选项的救星。救了我一些头痛
【解决方案2】:

buildx 可用于生成多架构清单列表和推送到注册表的图像。当您从注册表中提取它时,会检索适合您平台的清单。

这是在 19.03 中作为 CLI 插件提供的,当 CLI 处于实验模式时可用。您可以通过以下方式启用此功能:

export DOCKER_CLI_EXPERIMENTAL=enabled

对于多节点构建器环境,使用docker buildx create 配置构建器实例,使用--append 选项向构建器添加更多节点。然后在该构建器上docker buildx use 将实例用于您的命令。

对于在具有仿真的单个节点上构建,可以通过安装最新的qemu-user-static(软件包名称可能因其他 Linux 发行版而异)在基于 debian 的系统上完成,例如:

apt-get install -t testing qemu-user-static

有关为何需要更新版本的说明,请参阅:

一旦您安装了带有 binfmt_misc 设置的 qemu,并在 /proc/sys/fs/binfmt_misc/qemu-* 中设置了 F 标志,那么您可以使用以下命令在本地主机上进行交叉编译:

docker buildx create --driver docker-container --name local \
  --use unix:///var/run/docker.sock
docker buildx inspect --bootstrap local

然后您使用以下命令构建多架构映像:

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 \
  -t $registry_img_and_tag --output type=registry .

--platform 中包含您想要支持的每个平台。

我有一个presentation covering this。使用P 查看演示者备注。使用FROM --platform=$TARGETPLATFROM 有助于避免需要为其他平台拉取新图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2023-01-17
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多