best practices section of the Docker docs说:
因为图像大小很重要,所以使用ADD从远程获取包 强烈建议不要使用网址;你应该使用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之前,它是 最大限度地减少图像中的图层数量非常重要。 [...] Docker 17.05及更高版本添加了对多阶段构建的支持,允许您仅将所需的工件复制到最终图像中。
甚至
使用Bash&&amp ;;将两个RUN命令压缩在一起。操作者 [是]容易出错,难以维持。
在我看来,如果您使用的是多阶段构建,那么有关ADD
的建议是不准确的。额外的层不太可能是一个问题,除非您下载的东西真的很大,因为本地磁盘空间很便宜并且很容易清除旧图像。实际上,当编码时,通常没有构建命令清理它们的中间假象以节省空间!
此外, ADD
具有优于RUN wget
的主要优势:它可以检测目标何时发生变化。
我是否遗漏了某些内容,或者进行了多阶段修复ADD
?
答案 0 :(得分:2)
看起来确实如此: ADD
用于Katakoda "Creating optimized Docker Images using Multi-Stage Builds"示例(对于第一个图像,在第二个阶段之前)
通过两个步骤,您可以专注于最小化第二阶段中的{42-max for aufs,hard-limit 127)图层。