操作方法:Dockerfile 层重用/参考

Tal*_*eno 6 docker dockerfile

我想创建一些图像,其中每个 dockerfile 将包含一些公共层。所有图像都是混合的,没有一致的序列。例如,有些需要在它们上面安装 java,我想将以下几行(取自官方 java 8 dockerfile)定义为将在其他 dockerfile 中引用的构建块(层)。

在某些情况下,我想要重用的层可能不止一层——使这个需求本质上是递归的(由构建块构成的构建块)。

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
Run Code Online (Sandbox Code Playgroud)

现在 Docker 支持吗?以这种方式单独安装例如 Java 作为一个层是一个好习惯......还是我应该将它与其他安装合并(以保持图像最小)?请问这种情况下的最佳实践是什么?

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

似乎不支持引用/包含的功能。但我仍然不确定最佳实践......

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

在哪里鼓励对所有软件包安装使用“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
Run Code Online (Sandbox Code Playgroud)

Tal*_*eno 3

基于进一步阅读:

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

  2. 最佳实践鼓励对所有软件包安装使用“RUN 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(另请参阅构建缓存如何运行,将其识别为不同的层)

谢谢@Sri 的一些指导。