是否有办法强制Dockerfile中的特定行始终重新生成,同时仍然受益于前面层上的缓存?

是否有办法强制Dockerfile中的特定行始终重新生成,同时仍然受益于前面层上的缓存?,docker,dockerfile,Docker,Dockerfile,我经常不得不这样写Dockerfiles(为了清晰起见添加了行号): 在第(4)行,我正在获取一个远程资源。现在让我们假设这是一个JSON文件。它可能会时不时地改变,可能不是在每个构建上,而是可能每隔几个小时或几天 这意味着每次构建容器时,我都希望确保获取最新的JSON文件。强制执行此操作的一种方法是将--no cache参数添加到我的docker build命令中,但这会强制重建所有行/层,包括(1)-(3),其中可能不需要重建。是否有自动“污染”或“标记”行(4)的模式或技术,以便Docke

我经常不得不这样写Dockerfiles(为了清晰起见添加了行号):

在第(4)行,我正在获取一个远程资源。现在让我们假设这是一个JSON文件。它可能会时不时地改变,可能不是在每个构建上,而是可能每隔几个小时或几天


这意味着每次构建容器时,我都希望确保获取最新的JSON文件。强制执行此操作的一种方法是将
--no cache
参数添加到我的
docker build
命令中,但这会强制重建所有行/层,包括(1)-(3),其中可能不需要重建。是否有自动“污染”或“标记”行(4)的模式或技术,以便Docker知道它始终必须重新运行
wget
(可能这还必须强制重建行5),同时仍然获得行(1)-(3)的层缓存行为当Docker检测到pre-req文件没有更改时?

如果您试图触发重建的特定内容是运行wget…特定URL的结果,Docker实际上对此有本机支持

有两个类似的命令可以将文件复制到容器中<代码>复制仅从生成上下文复制文件。还可以获取外部URL和解压本地存档(但不能同时获取外部URL和解压本地存档)。一般建议使用
COPY
,除非您需要
ADD
中的某一项特定功能,否则使用
COPY

所以你应该能够说

ADD http://some.remote.server/some.remote.path.for.example.json .
RUN some-other-local-commands-which-may-depend-on-the-json
RUN
命令将根据提取文件的内容使用Docker层缓存


如果此方法不适用于您(可能需要特殊身份验证才能获取文件),您也可以在运行
Docker build
之前在Docker外部获取文件,然后将其复制到中。同样,它将像您复制的任何其他文件一样工作,层缓存将根据文件是否已更改而生效。

David,谢谢您的回答。不过,我认为这是“错误的”,原因有两个。首先,您是对的,在
wget
的情况下,那么ADD将获取一个远程文件,但是我使用
wget
只是为了表示一个外部网络操作的示例。例如,可以是
curl
POST,也可以是完全不同的内容。其次,你的回答与我的要求相反(希望如此!)。我希望
ADD
不要使用层缓存,不要使用它。否则,
运行wget
将执行相同的操作。对不起,我很抱歉,我重新阅读了您的答案。我现在明白了<代码>添加在我的情况下可以完成这项工作,是的。但我正在寻找一个更通用的答案,用于基于网络的运行线路(甚至非基于网络的)。对于通过URL获取外部文件的特定情况,您可以使用
ADD
。不过,没有更普遍的解决方案;@jornsharpe links to的问题描述了一个类似的基于
ADD
git clone
解决方案,但是没有办法告诉Docker“总是尝试
运行这个特定步骤,但是如果没有任何更改,可能会返回缓存”。链接的答案有一些我可以接受的技巧(例如,打电话给random.org的那一行)但我很感激这是一个黑客行为。无论如何,谢谢你的输入。我会将你的答案标记为正确,因为它确实回答了我问题的狭义解释。@jonrsharpe是的,这是个骗局。谢谢你发现了它。
ADD http://some.remote.server/some.remote.path.for.example.json .
RUN some-other-local-commands-which-may-depend-on-the-json