我想创建一些图像,其中每个 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)
基于进一步阅读:
目前没有类似 INCLUDE 的功能。https://github.com/docker/docker/issues/735
最佳实践鼓励对所有软件包安装使用“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 的一些指导。
| 归档时间: |
|
| 查看次数: |
2907 次 |
| 最近记录: |