多级Docker:RUN wget vs ADD

Moh*_*han 9 docker

Docker文档最佳实践部分说:

由于图像大小很重要,因此强烈建议不要使用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 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
Run Code Online (Sandbox Code Playgroud)

另一方面,稍后会注意到:

在Docker 17.05之前,甚至更多,在Docker 1.10之前,最小化图像中的层数非常重要.[...] Docker 17.05及更高版本增加了对多阶段构建的支持,允许您仅将所需的工件复制到最终图像中.

乃至

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

在我看来,如果你使用多阶段构建,建议ADD是不准确的.额外的层不太可能是一个问题,除非您下载的东西真的很大,因为本地磁盘空间很便宜并且很容易清除旧图像.实际上,当编码时,通常没有构建命令来清理它们的中间伪像以节省空间!

此外,它ADD具有以下优势RUN wget:它可以检测目标何时发生变化.

我错过了什么,还是做了多阶段修复ADD

Von*_*onC 5

它看起来确实像这样:例如在Katakoda“使用多阶段构建创建优化的 Docker 映像”ADD示例中使用(对于第一个映像,在第二阶段之前。

通过两个步骤,您可以仅在第二阶段专注于最小化(aufs 最大为 42硬限制 127 )层。