首页 > 解决方案 > docker 镜像可以像 rpm noarch 一样跨平台吗?

问题描述

有没有办法在多架构基础图像上构建图像(用于运行时),但不指定 cpu 架构?这相当于 .rpm "noarch" 或 .dep "any" arch。

在构建 Java 和 nodejs 图像时,通常没有特定于架构的内容,提供单个通用图像会简单得多。

这与多架构不同,后者为具有相同名称的不同架构构建同一映像的多个副本。 https://www.docker.com/blog/multi-platform-docker-builds/

标签: docker

解决方案


这在技术上是不可能的。复杂之处不在于您尝试运行的程序不可移植,而在于 Docker 映像还包含其解释器,并且不可移植。

作为一个绝对最小的例子,考虑一个只运行一个 shell 脚本的 Docker 镜像:

#!/bin/sh
echo 'Hello, world!'

它的 Dockerfile看起来是可移植的:

FROM busybox
COPY hello.sh /bin
CMD ["/bin/hello.sh"]

但是,busybox图像是特定于架构的;它包含 C BusyBox 代码的编译二进制文件。由于派生的映像是特定于体系结构的busybox基础映像加上可移植的 shell 脚本,因此生成的映像是特定于体系结构的。

类似的约束适用于已编译的 JVM 或 Node 解释器。在图像堆栈中的某个时刻,您必须深入了解一些可以执行可移植内容的本机编译代码。


推荐阅读