0

是否可以使用多阶段Dockerfile,其中第一个基本映像属于 Ubuntu,然后第二个属于 Alpine。我知道使用此 Dockerfile 构建生成的最终映像无法在 Ubuntu 平台上执行,因为它还包含 Alpine 指令,如果您在 Alpine 上执行它也是如此。但我仍然想确认是否是这种情况

例如,这是我的示例 Dockerfile:

FROM some-ubuntu-base-image:latest 

RUN apt-get update && apt-get install -y my-ubuntu-package

FROM some-alpine-base-image:latest

RUN apk add my-alpine-package

............
.............
4

2 回答 2

3

首先,没有什么可以阻止 Alpine 映像在 Ubuntu docker 主机上运行。这些是在同一个 Linux 内核之上运行的不同文件系统,共享内核不会影响运行不同分发二进制文件/库的能力。

在多阶段部分,您可以为每个状态使用您想要的任何图像,这些图像彼此独立。多阶段不是合并图像的方法,在第二阶段开始时(除非该阶段来自第一阶段输出),您在第二阶段的文件系统中的第一阶段没有任何内容。

您将遇到的问题是,如果您在文件系统上依赖于其他文件(例如库)的阶段之间复制文件。最常见的问题是尝试在使用 musl 的 Alpine 系统上运行针对 libc 编译的二进制文件。

于 2020-06-16T17:50:48.660 回答
1

是的,它。但是,它可能会导致问题:如果您使用动态链接,您可能正在复制一个可执行文件,该可执行文件需要一个库版本,该版本在您制作它的阶段可用,但在最终映像的分发时不可用。然而,对于静态编译的语言/程序(如 Go)来说,这不是一个大问题,因为它们本质上是将它们使用的库捆绑到可执行文件中。

但是,如果可以,您应该避免这样做。除特定情况外,这是一种不兼容的风险,没有太大的价值。

于 2020-06-16T17:59:09.500 回答