我有一个建在顶部的容器Debian:杰西(有一些 openssl 编译和一些自定义内容)。我希望我的图像是可发射在不同的架构上,例如在“正常”的 x86_64 操作系统上,以及在基于 ARM 的架构上,如 RaspberryPI。
我发现当我在 x86_64 上构建映像并将其发布到 HUB 上时,它在拉到 ARM 设备上时不起作用,反之亦然。尝试这样做会导致一些“找不到某些库”或“无法识别的命令”错误。
问题是:如何构建和发布我的图像以便它可用于其他架构(以及,重要的是 - 如何告诉docker在下载时自动选择合适的架构)?
我理解了Debian 容器“已被移植”到不同的架构但我找不到有关如何针对我的图像实现此操作的任何信息。
答案1
docker 中的多架构镜像正在积极开发中。其中的关键部分是一个docker manifest
cli,它此 PR 中仍在开发中。
首先,您需要为不同的架构创建映像,这些映像始终可以直接在相应的架构系统上运行。多架构映像是一个指向这些映像的“清单列表”。然后,当您拉取多架构映像时,docker 客户端将从该列表拉取相应的映像。
在上述 PR 集成到 Docker 之前,您可以使用清单工具它允许您定义清单列表并将其推送到注册服务器。这允许输入如下例所示的 yaml 文件:
image: myprivreg:5000/someimage:latest
manifests:
-
image: myprivreg:5000/someimage:ppc64le
platform:
architecture: ppc64le
os: linux
-
image: myprivreg:5000/someimage:amd64
platform:
architecture: amd64
features:
- sse
os: linux
然后运行以下命令获取上述 yaml 文件并将其转换为推送到定义的注册表的清单列表:
./manifest-tool push from-spec someimage.yaml
答案2
- 根据相关架构的图像构建您的图像。
- 例如:
arm32v7/debian:jessie
而不是debian:jessie
- 例如:
- 将其标记为其他内容。
- 例如:
fracz/fooapp:arm32-latest
,,fracz/fooapp:raspi-latest
fracz/fooapp:grandma-use-this-one
- 例如:
- 无论谁想要运行您的图像,都有责任选择适当的标签。
- 尽管你可能想在你的文档/自述文件/等中添加一些相关信息