操作方法:Dockerfile层重用/引用

我想创build几个图像,其中每个dockerfile将包含一些常见的图层。 它的所有图像都是混合的,没有一致的顺序。 例如,有些需要在它们上面有java,我想把下面几行(从官方的java 8 dockerfile中取出)定义为一个将在其他dockerfiles中引用的构build块(层)。

在某些情况下,它可能是我想要重复使用的多个图层 – 使得这个需求在本质上是recursion的(由构build块构build的构build块)。

RUN \ echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update && \ apt-get install -y oracle-java8-installer && \ rm -rf /var/lib/apt/lists/* && \ rm -rf /var/cache/oracle-jdk8-installer 

Docker今天支持吗? 这是一个很好的做法,例如像Java一样分别安装,或者我应该将它与其他安装(保持图像最小)合并? 围绕这种情况的最佳做法是什么?

===========更新==============

看起来像引用/包括的function不被支持。 但我仍然不确定最佳做法…

@Sri指出了最佳实践: https ://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#run

鼓励在所有软件包安装中使用“运行apt-get update && apt-get install -y”。

但这是否也意味着我们不鼓励为不同的包使用不同的层次? 如下面的例子:

 RUN apt-get update && apt-get install -y package-foo RUN apt-get update && apt-get install -y package-bar 

Docker具有基本映像的概念。 这可以在Dockerfile中作为“FROM <base-image>”提供。 这应该是Dockerfile中的第一行。 基础图像可以包含所有的公共区域,并且单个容器可以处理特定的function。

根据进一步阅读:

  1. 目前没有类似function的INCLUDE。 https://github.com/docker/docker/issues/735

  2. 最佳实践鼓励在所有软件包安装中使用“运行apt-get update && apt-get install -y”。 但是这并不意味着你不能使用相同的技术来分离软件包的安装(例如package-foo和package-bar)。 这是一个折衷与最小化的层数。 https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/minimize-the-number-of-layers (另请参阅构build高速caching如何操作,将其标识为不同的层)

感谢@Sri的一些主angular。