我们可以有一个多阶段的 Dockerfile,其中 FROM 下的图像可以属于不同的 linux OS 分布
Can we have a multi-stage Dockerfile where images under FROM could pertain to different linux OS distribution
是否可以使用多阶段 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
............
.............
首先,没有什么可以阻止 Alpine 映像 运行 在 Ubuntu docker 主机上运行。这些是不同的文件系统 运行 在同一个 Linux 内核之上,共享内核不会影响 运行 不同分布的能力 binaries/libraries.
从多阶段部分,你可以为每个状态使用你想要的任何图像,它们彼此独立。多阶段不是合并图像的一种方式,在第二阶段开始时(除非该阶段来自第一阶段输出)在第二阶段的文件系统中您没有来自第一阶段的任何内容。
您将遇到的问题是,如果您在依赖于文件系统上其他文件(例如库)的阶段之间复制文件。最常见的问题是尝试 运行 在使用 musl 的 Alpine 系统上针对 libc 编译的二进制文件。
是的,是的。然而,这可能会导致问题:如果您使用动态链接,您可能正在复制一个可执行文件,该可执行文件需要一个库版本,该库版本在您创建它的阶段可用,但在您的最终图像分发时不可用。然而,对于 languages/programs 静态编译(如 Go)来说,这不是一个大问题,因为它们基本上将它们使用的库捆绑到可执行文件中。
不过,如果可以的话,你应该避免这样做。除了特定情况,这是一种不兼容的风险,没有太大价值。
是否可以使用多阶段 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
............
.............
首先,没有什么可以阻止 Alpine 映像 运行 在 Ubuntu docker 主机上运行。这些是不同的文件系统 运行 在同一个 Linux 内核之上,共享内核不会影响 运行 不同分布的能力 binaries/libraries.
从多阶段部分,你可以为每个状态使用你想要的任何图像,它们彼此独立。多阶段不是合并图像的一种方式,在第二阶段开始时(除非该阶段来自第一阶段输出)在第二阶段的文件系统中您没有来自第一阶段的任何内容。
您将遇到的问题是,如果您在依赖于文件系统上其他文件(例如库)的阶段之间复制文件。最常见的问题是尝试 运行 在使用 musl 的 Alpine 系统上针对 libc 编译的二进制文件。
是的,是的。然而,这可能会导致问题:如果您使用动态链接,您可能正在复制一个可执行文件,该可执行文件需要一个库版本,该库版本在您创建它的阶段可用,但在您的最终图像分发时不可用。然而,对于 languages/programs 静态编译(如 Go)来说,这不是一个大问题,因为它们基本上将它们使用的库捆绑到可执行文件中。
不过,如果可以的话,你应该避免这样做。除了特定情况,这是一种不兼容的风险,没有太大价值。