多级Docker:RUN wget vs ADD

时间:2017-12-09 06:59:48

标签: docker

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

1 个答案:

答案 0 :(得分:2)

看起来确实如此: ADD 用于Katakoda "Creating optimized Docker Images using Multi-Stage Builds"示例(对于第一个图像,在第二个阶段之前)

通过两个步骤,您可以专注于最小化第二阶段中的{42-max for aufshard-limit 127)图层。