使用ADD
而不是RUN
使图层缓存失效有什么好处吗?
背景
我经常看到Dockerfiles将wget或curl安装到RUN wget …
或RUN curl …
,以安装一些在包管理中找不到的依赖项。
我怀疑这些可以转换为简单的ADD <url> <dest>
线,这至少可以避免向图像添加curl或wget。
此外,Docker守护进程似乎可以依赖HTTP缓存失效来通知自己的层缓存失效。至少(例如,在没有HTTP缓存头的情况下),它可以对资源进行GET
、散列,并以与本地文件相同的方式计算失效。
**注意:**我熟悉Add
与RUN …
的 * 用法 *,但我希望找到一个强有力的理由来选择其中一个。特别是,我想知道ADD <url>
在图层缓存无效方面是否可以表现得更智能。
2条答案
按热度按时间2w3kk1z51#
当然可以。
RUN
指令不会该高速缓存失效,除非它的文本发生了变化。因此,如果远程文件被更新,您将无法获得它。Docker将使用缓存的层。ADD
指令将始终下载文件,如果文件的校验和不再匹配,该高速缓存将失效。我建议使用
ADD
而不是RUN wget ...
或RUN curl ...
。我想人们使用后者是因为它更熟悉,但是ADD
指令非常强大。它可以解压缩文件并设置所有权。它也被认为是避免下载进程运行所不需要的任何包的最佳实践(尽管有多种方法可以实现这一点,比如使用多阶段构建)。缓存失效单据:
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache
wvt8vs2t2#
如果您正在下载存档文件,最好使用
RUN wget …
或RUN curl …
。它允许在同一个RUN
命令中解压缩存档文件并删除下载的文件。因此,下载的文件本身不会存储在映像中。正如Docker文档所述:“强烈建议不要使用ADD从远程URL获取软件包”
避免做以下事情:
相反,请执行以下操作: