我使用了基本的docker镜像(openjdk)来创建一个具有简单Java程序的图像。
但我想知道我是否在docker文件中使用了2个基本图像。我们怎么做?
我认为docker不支持以下任何内容:
FROM dockerImaage1
FROM dockerImage2
其中一个场景,为什么需要这个是我想要一个ubuntu
的图像openjdk
,所以一种方法是使用ubuntu的基本图像和docker文件写入指令来安装openjdk,设置JAVA_HOME变量等,这无疑是麻烦的。
另一种选择,我喜欢在ubuntu的基础内使用openjdk
的基本图像(如果可能的话)。
可能有更多典型的案例,我们可能需要的是非常严重的特征。
SO 有关如何在docker文件中使用2个基本图像的任何想法?有没有人这样做过?
我找到了一个反向工程here的链接,但它有一些限制,比如如果ubuntu的docker文件使用ADD或COPY等命令,逆向工程就会失败。
答案 0 :(得分:5)
答案是否定的。请参阅Moby问题中的详细讨论How do I combine several images into one via Dockerfile。
容器背后的想法是,真实构图的最小单位是容器。通常,将多个图像合并到一个图像可能会引入一些问题。例如,不同的图像在库或库版本上存在冲突。
答案 1 :(得分:3)
容易吗?不,Docker不支持这一点,因为它可以有效地组合多个Linux根文件系统。
最简单的方法是从Ubuntu开始,然后安装openjdk,或者在docker hub上找到一个已经这样做的图像。
答案 2 :(得分:2)
最新版本的docker具有多阶段构建的概念。参考:(https://docs.docker.com/engine/userguide/eng-image/multistage-build/)
使用多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础,并且每个指令都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,在最终图像中留下您不想要的所有内容。