当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以强制我的docker文件中的某一行总是重新构建,同时仍然受益于前面层上的缓存?[重复]

空佐
2023-03-14

我似乎经常不得不这样写docker文件(为了清楚起见,增加了行号):

1. FROM somebase
2. RUN cp /some/local/stuff /some/docker/container/path
3. RUN some-other-local-commands
4. RUN wget http://some.remote.server/some.remote.path.for.example.json
5. RUN some-other-local-commands-which-may-depend-on-the-json

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

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

共有1个答案

司空祯
2023-03-14

如果你试图触发重建的特定内容是 RUN wget 的结果......一个特定的 URL,Docker 实际上确实对此有原生支持。

有两个类似的命令可以将文件复制到容器中。COPY 仅从构建上下文中复制文件。ADD 还可以获取外部 URL 并解压缩本地存档(但不能同时解压缩两者)。一般建议是使用 COPY,除非您需要 ADD 执行不同的特定操作之一。

所以你应该可以说

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构建之前在Docker之外获取文件,然后COPY将其放入。同样,它将像您COPY中的任何其他文件一样工作,层缓存将根据文件是否已更改而生效。

 类似资料:
  • 我是不是又被灌了五万秒?总之是为了缩短时间? 编辑备注: 在app.yaml中,我有这个处理程序: 我现在已尝试删除过期: 我在app.yaml的顶部添加了以下内容: 此外,删除文件不会使它们在我部署时消失。

  • 我已经回顾了类似的问题“查看并清除Postgres缓存/缓冲区?,但所有的答案都集中在数据缓冲区上,并且自2010年以来,Postgresql发生了很大变化。 与那个问题的OP不同,我不是在计算性能时寻找一致的行为,而是在数据库随时间变化时寻找自适应的行为。 在我的应用程序中,在作业执行开始时,工作表中的行为空。查询运行非常快,但是随着时间的推移,性能下降,因为准备好的语句没有使用理想的访问路径(

  • 问题内容: 是否有一种方法可以强制docker-machine使用特定的IP创建docker vm(假设该IP可用)? 问题答案: 在问题1709中主动请求 当我使用docker-machine create创建虚拟机时,我希望能够指定VM的IP地址(即docker-machine ls中“ URL”下列出的值)。 我想要这个是因为我一直依赖boot2docker的默认地址192.168.59.1

  • 作为一个学校项目,我正在开发一个坦克游戏,我正在努力使它尽可能的用户友好(比如可定制的按键绑定、显示设置)。然而,我不希望游戏窗口失去它的比例,所以我想我会在游戏窗口的两侧添加边框,以支持宽屏幕。 我附上了一张图片来说明我在寻找什么: 因此,为了让它工作,我需要一种制作“屏幕层”的方法。基本层是整个屏幕,在屏幕两侧添加了一些图形和显示分数的字体。然后,第二层将呈现在屏幕的中间,这将是游戏窗口,其宽

  • 问题内容: 如果输入大小太小,则库会自动序列化 流中地图的执行,但是这种自动化不会并且也不会考虑地图操作的繁重程度。有没有办法 强制parallelStream()实际并行化CPU重映射? 问题答案: 似乎存在根本的误解。链接的“问答”讨论了由于OP没有 看到预期的加速,流显然不能并行工作。结论是,有没有好处在 并行处理工作负载是否太小,不,有一个自动回退到顺序执行。 实际上是相反的。如果您请求并

  • 问题内容: 我正在使用Retrofit,并且在每个任务中我都必须执行以下操作: 使此代码成为DRY的好方法是什么? 问题答案: 首先,您以所有常见行为声明父类 然后,您将其扩展到每个任务 但是我不知道您在哪里使用restAdapter和apiManager,以及如果实际上每个任务需要创建一次,因为您可能可以在这些任务之外创建它。 如果在外部创建它们,然后需要在任务内部使用某些东西,那么牢记Depe