Dockerfile.1执行多个 RUN:
FROM busybox
RUN echo This is the A > a
RUN echo This is the B > b
RUN echo This is the C > c
Dockerfile.2也加入了这一行列:
FROM busybox
RUN echo This is the A > a &&\
echo This is the B > b &&\
echo This is the C > c
每个 RUN创建一个层,所以我总是假设层数越少越好,因此 Dockerfile.2就越好。
当一个 RUN删除了之前的 RUN(即 yum install nano && yum clean all)添加的内容时,这显然是正确的,但是在每个 RUN添加内容的情况下,有几点我们需要考虑:
层应该只是添加一个差异以上的前一个,所以如果后一个层没有删除添加到前一个,应该没有太多的磁盘空间节省优势之间的两种方法。
层是从 Docker Hub 并行提取的,因此 Dockerfile.1尽管可能稍微大一些,但理论上下载速度会更快。
如果添加第4个句子(即 echo This is the D > d)并在本地重新构建,那么由于缓存的存在,Dockerfile.1会构建得更快,但是 Dockerfile.2将不得不再次运行所有4个命令。
那么,问题来了: 处理 Dockerfile 的更好方法是什么?