由于图像大小很重要,因此强烈建议不要使用ADD从远程URL获取包.你应该使用curl或wget代替.这样,您可以删除提取后不再需要的文件,并且不必在图像中添加其他图层.例如,你应该避免做以下事情:
Run Code Online (Sandbox Code Playgroud)ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all
而是做一些像:
Run Code Online (Sandbox Code Playgroud)RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all
另一方面,稍后会注意到:
在Docker 17.05之前,甚至更多,在Docker 1.10之前,最小化图像中的层数非常重要.[...] Docker 17.05及更高版本增加了对多阶段构建的支持,允许您仅将所需的工件复制到最终图像中.
乃至
使用Bash &&运算符将两个RUN命令压缩在一起[是]容易出错且难以维护.
在我看来,如果你使用多阶段构建,建议ADD
是不准确的.额外的层不太可能是一个问题,除非您下载的东西真的很大,因为本地磁盘空间很便宜并且很容易清除旧图像.实际上,当编码时,通常没有构建命令来清理它们的中间伪像以节省空间!
此外,它ADD
具有以下优势RUN wget
:它可以检测目标何时发生变化.
我错过了什么,还是做了多阶段修复ADD
?
它看起来确实像这样:例如在Katakoda“使用多阶段构建创建优化的 Docker 映像”ADD
示例中使用(对于第一个映像,在第二阶段之前。
通过两个步骤,您可以仅在第二阶段专注于最小化(aufs 最大为 42,硬限制 127 )层。