在Dockerfile中使用ADD与RUN wget/curl相比,是否具有缓存优势< url>< url>

3pvhb19x  于 2023-03-17  发布在  Docker
关注(0)|答案(2)|浏览(219)

使用ADD而不是RUN使图层缓存失效有什么好处吗?

背景

我经常看到Dockerfiles将wget或curl安装到RUN wget …RUN curl …,以安装一些在包管理中找不到的依赖项。
我怀疑这些可以转换为简单的ADD <url> <dest>线,这至少可以避免向图像添加curl或wget。
此外,Docker守护进程似乎可以依赖HTTP缓存失效来通知自己的层缓存失效。至少(例如,在没有HTTP缓存头的情况下),它可以对资源进行GET、散列,并以与本地文件相同的方式计算失效。

**注意:**我熟悉AddRUN …的 * 用法 *,但我希望找到一个强有力的理由来选择其中一个。特别是,我想知道ADD <url>在图层缓存无效方面是否可以表现得更智能。

2w3kk1z5

2w3kk1z51#

当然可以。
RUN指令不会该高速缓存失效,除非它的文本发生了变化。因此,如果远程文件被更新,您将无法获得它。Docker将使用缓存的层。
ADD指令将始终下载文件,如果文件的校验和不再匹配,该高速缓存将失效。
我建议使用ADD而不是RUN wget ...RUN curl ...。我想人们使用后者是因为它更熟悉,但是ADD指令非常强大。它可以解压缩文件并设置所有权。它也被认为是避免下载进程运行所不需要的任何包的最佳实践(尽管有多种方法可以实现这一点,比如使用多阶段构建)。
缓存失效单据:
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache

wvt8vs2t

wvt8vs2t2#

如果您正在下载存档文件,最好使用RUN wget …RUN curl …。它允许在同一个RUN命令中解压缩存档文件并删除下载的文件。因此,下载的文件本身不会存储在映像中。
正如Docker文档所述:“强烈建议不要使用ADD从远程URL获取软件包”
避免做以下事情:

ADD https://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 https://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

相关问题