docker 镜像可以像 rpm noarch 一样跨平台吗?

时间:2021-06-02 15:28:52

标签: docker

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

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

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

1 个答案:

答案 0 :(得分:0)

这在技术上是不可能的。复杂的不是您尝试运行的程序不可移植,而是 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 解释器。在图像堆栈中的某个点,您必须深入了解一些可以执行可移植内容的本机编译代码。