如何使用多个基础镜像构建Docker镜像

33

我使用了一个基础的docker镜像(openjdk)来创建一个简单的Java程序镜像。

但是我在想,如果我在一个Docker文件中使用2个基础镜像,我们该如何做到呢? 我不认为Docker支持下面这种方式:

FROM dockerImaage1
FROM dockerImage2

为什么需要这样做的情况之一是我想要一个包含openjdkubuntu镜像,一种方法是使用ubuntu基础镜像并在docker文件中编写指令来安装openjdk、设置JAVA_HOME变量等,这无疑是繁琐的。

另一种选择是在ubuntu基础镜像中使用openjdk的基础镜像(如果可能的话)。

可能还有更典型的情况,我们迫切需要这个功能。

所以在docker文件中如何使用两个基础镜像的任何想法? 有人尝试过吗?

我找到了一个反向工程链接这里,但它有一些限制,比如如果ubuntu的docker文件使用ADD或COPY命令,则反向工程将失败。


3
许多图像都公开了它们的Dockerfile。很少需要进行逆向工程。 - Henry
1
可能是将Docker镜像合并为一个容器的方法?的重复问题。 - François Maturel
3个回答

21

最新版的docker引入了多阶段构建的概念。参考: (https://docs.docker.com/engine/userguide/eng-image/multistage-build/)

使用多阶段构建时,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础镜像,并开始构建过程的一个新阶段。您可以选择性地从一个阶段复制构件到另一个阶段,丢弃掉不想要在最终镜像中出现的所有内容。


8
这是一个边缘化的仅链接回答。您应该扩展您的回答,包括尽可能多的信息,并仅将链接用于参考。 - Filnor
2
这是对词语“边缘”的边缘使用。 - Nebulosar

7
答案是否定的。请参阅Moby问题中的详细讨论:如何通过Dockerfile将多个图像组合成一个
容器背后的想法是,真正的组合最小单元是容器。通常情况下,将多个图像合并为一个图像可能会引入一些问题。例如,不同的图像在库或库版本上存在冲突。

过时的答案 - cryanbhu

6

轻松吗?不是的。Docker不支持这样做,因为这将有效地合并多个Linux根文件系统。

最简单的方法是从Ubuntu开始,然后安装openjdk,或者找到已经安装了openjdk的Docker镜像。


所以基本上答案是“不行”。没有任何方法可以合并两个Docker文件。 - Prashant Prabhakar Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接