多阶段Docker:RUN wget vs ADD

Docker文档的最佳实践部分说:

由于图像大小很重要,强烈build议使用ADD从远程URL获取软件包; 你应该使用curl或wget来代替。 这样,你可以删除不再需要的文件,而不需要在图像中添加另一个图层。 例如,你应该避免做这样的事情:

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 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之前,重要的是尽量减less图像中的图层数量。 Docker 17.05及更高版本添加了对多阶段构build的支持,这允许您只将需要的构件复制到最终的图像中。

乃至

使用Bash &&运算符将两个RUN命令压缩在一起[容易出错并且难以维护。

在我看来,如果你正在使用多阶段构build,关于ADD的build议是不准确的。 除非你正在下载真正巨大的东西,否则额外的图层不太可能成为问题,因为本地磁盘空间很便宜,而且很容易清除旧图像。 事实上,编码时通常不会有构build命令来清理中间的文物,以节省空间!

另外, ADD具有比RUN wget重要的优势RUN wget :它检测目标何时改变

我错过了什么,或者做多阶段build设修复ADD

它看起来像这样: ADD用在片假名“创build优化docker图像使用多阶段构build”的例子中(对于第一个图像,在第二个阶段之前)。

通过两个步骤,您可以专注于最小化第二阶段( 最大为42,最大为 127 )的图层。