linux - 如何制作多架构 Docker 镜像?

标签 linux docker x86 raspberry-pi arm

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

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

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

最佳答案

I know other companies create images to support multiple architectures, how are they doing this?

简单的回答是,不可能创建支持多种架构的单个镜像。然而,看起来好像一张图像可以满足多种架构,因为您实际上正在与 a manifest file 交互。 。 list 文件充当基于请求图像的 Docker 客户端的正确图像的指针。

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

完成后,您将需要enable experimental mode在 Docker CLI 中,以及 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 list 注释 步骤。

注意:推送 list 文件时(即docker Manifest Push ...),请务必使用--purge选项;链接的文章中没有讨论它。如果您打算使用稍后重用的标签(例如 latest),不使用 --purge 会导致您心痛。

关于linux - 如何制作多架构 Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59613303/

相关文章:

x86 - 8088/8086 WAIT指令和BIU

linux - 在超时内给出命令错误

linux - 如何让 ecryptfs 自动使用我的 key ?

c++ - 如何停止 gSOAP 操作

java - Big Query Java 客户端的代理设置

elasticsearch - docker-compose.yml 用于 Elasticsearch 和 kibana

docker - Jenkinsfile与docker容器内的writeFile?

python - Linux、Python打开终端运行全局python命令

assembly - 为什么gcc会产生额外的寄信人地址?

c - 从float转换为double会产生不同的结果-相同的代码,相同的编译器,相同的OS