我想创建一些图像,其中每个 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 …Run Code Online (Sandbox Code Playgroud) 只是好奇F#为什么:
member val Foo = ... with get, set
省略自我标识符(例如this.).这仍然是一个实例属性.也许我是唯一一个在使用它时感到困惑的人.但只是打扰我,足以查询谁知道语言是如何定义的.