【问题标题】:How to use multiple base images to build a docker image如何使用多个基础镜像构建一个 docker 镜像
【发布时间】:2017-09-29 12:14:30
【问题描述】:

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

但我想知道我是否在 docker 文件中使用 2 个基本图像。我们怎么能做到这一点? 我认为 docker 不支持类似的东西:

FROM dockerImaage1
FROM dockerImage2

其中一个场景,为什么需要这样做是我想要一个具有openjdkubuntu 的图像,所以一种方法是我使用ubuntu 的基本图像和docker 文件中的写入指令来安装openjdk,设置JAVA_HOME变量等,这无疑是繁琐的。

另一种选择,我喜欢在 ubuntu 的基础中使用 openjdk 的基础图像(如果可能的话)。

可能还有更典型的情况,我们可能需要非常糟糕的特性。

所以关于如何在 docker 文件中使用 2 个基本图像的任何想法?有人做过吗?

我找到了一个逆向工程的链接here,但是它有一些限制,比如如果ubuntu的docker文件使用ADD或COPY等命令,逆向工程就会失败。

【问题讨论】:

标签: ubuntu docker dockerfile


【解决方案1】:

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

对于多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础,并且它们中的每一个都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的所有内容。

【讨论】:

  • 这是一个边界线link-only answer。您应该在此处扩展您的答案以包含尽可能多的信息,并仅将链接用作参考。
【解决方案2】:

答案是否定的。详见 Moby issue How do I combine several images into one via Dockerfile

容器背后的理念是,真正构成的最小单位是容器。通常,将多张图像合并为一张图像可能会带来一些问题。例如,不同的图像在库或库版本上存在冲突。

【讨论】:

  • 过时的答案
【解决方案3】:

容易吗?不。Docker 不支持这一点,因为它会有效地组合多个 Linux 根文件系统。

最简单的方法是从 Ubuntu 开始,然后安装 openjdk,或者在 docker hub 上找到一个已经安装好的镜像。

【讨论】:

  • 所以基本上答案是否定的。没有办法合并 2 个 docker 文件。
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2020-01-20
  • 2020-07-24
  • 2021-11-25
  • 2023-01-28
  • 2022-01-14
相关资源
最近更新 更多