如何制作多架构 Docker 镜像?

Zak*_*Zak 0 linux x86 arm raspberry-pi docker

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

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

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

Zak*_*Zak 6

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

简单的回答是,这是不是可以创建一个单一的形象,将支持多种架构。但是,看起来好像一个图像将满足多种架构,因为您实际上是在与清单文件交互。清单文件充当指向基于请求图像的 Docker 客户端的正确图像的指针。

例如,您可以docker build在一个x86_64平台(例如您的 Linux 笔记本电脑)上运行,然后又在一个armv7l平台(例如 Raspberry Pi)上运行,这将创建两个完全不同的映像。生成的镜像应该被赋予特定于平台的名称并推送到您的 Docker 镜像存储库(例如hub.docker.com)。

完成后,您将需要在 Docker CLI 中启用实验模式,并创建并上传具有平台中性名称的清单文件,该文件指向相应的平台特定图像。

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]
Run Code Online (Sandbox Code Playgroud)

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

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