Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 禁用特定运行命令的缓存_Docker - Fatal编程技术网

Docker 禁用特定运行命令的缓存

Docker 禁用特定运行命令的缓存,docker,Docker,我在Docker文件中有一些运行命令,我希望在每次构建Docker映像时使用-无缓存运行这些命令 我知道docker构建--no cache将禁用整个docker文件的缓存 可以为特定的运行命令禁用缓存吗?不可以直接禁用,但您可以将Dockerfile分为几个部分,构建一个映像,然后在下一个Dockerfile开始时从此映像开始,并从2016年2月开始构建带缓存或不带缓存的映像。这是不可能的 该功能已在请求。在要禁用缓存的区域之前,始终可以选择插入一些无意义且廉价的运行命令 如中所述,可以添加构

我在Docker文件中有一些
运行
命令,我希望在每次构建Docker映像时使用
-无缓存
运行这些命令

我知道docker构建--no cache将禁用整个docker文件的缓存


可以为特定的运行命令禁用缓存吗?

不可以直接禁用,但您可以将Dockerfile分为几个部分,构建一个映像,然后在下一个Dockerfile开始时从此映像开始,并从2016年2月开始构建带缓存或不带缓存的映像。这是不可能的


该功能已在

请求。在要禁用缓存的区域之前,始终可以选择插入一些无意义且廉价的运行命令

如中所述,可以添加构建参数块(名称可以是任意的):

在该区域之前,通过添加
--build arg CACHEBUST=$(date+%s)
作为
docker build
参数来修改每次运行的值(值也可以是任意的,这里是当前日期时间,以确保其在运行期间的唯一性)


当然,这也将禁用以下所有块的缓存,因为中间映像的哈希和将不同,这使得真正的选择性缓存禁用成为一个非常重要的问题,考虑到docker当前的工作方式。

另一个快速解决方法是在您的命令之前写入一些随机字节

RUN head -c 5 /dev/random > random_bytes && <run your command>
runhead-c5/dev/random>random\u字节&&

写出5个随机字节,这将强制缓存未命中一周前添加的功能

ARG FOO=bar

FROM something
RUN echo "this won't be affected if the value of FOO changes"
ARG FOO
RUN echo "this step will be executed again if the value of FOO changes"

FROM something-else
RUN echo "this won't be affected because this stage doesn't use the FOO build-arg"
使用

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
在跑步路线之前,您希望始终跑步。这是因为ADD将始终获取文件/URL,并且上面的URL在每个请求上生成随机数据,Docker然后比较结果以查看是否可以使用缓存


我也测试过这个,效果很好,因为它不需要任何额外的Docker命令行参数,也可以从Docker-compose.yaml文件中工作:)

我相信这是对@steve的答案的一个轻微改进,如上所述:

RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git

WORKDIR your_repository

# Calls for a random number to break the cahing of the git clone
# (https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull
这将使用git克隆的Docker缓存,但随后会运行存储库的未缓存更新


它似乎可以工作,而且速度更快-但非常感谢@steve提供了基本原则。

如果您的目标是包含来自Github(或类似)的最新代码,则可以使用Github API(或等效工具)使用
ADD
命令获取有关最新提交的信息。
docker build
将始终从
ADD
命令获取URL,如果响应与上次运行
docker build
时收到的响应不同,则不会使用后续缓存层

例如


禁用单个命令的缓存后,如果结果与以前的缓存运行不匹配,则需要重新生成所有剩余步骤。这就是你的目标,还是你希望只重建一个层,并以某种方式将其注入先前缓存数据的存储位置?我希望重建特定层,例如“git pull”命令。现在,“git pull”命令将被缓存,即使repo已更新。通过传递一个未使用的参数来强制执行pull非常容易。但重建缓存条目的结果是,以下所有层都需要重建。有关示例,请参阅。如果要在git remote发生更改时使缓存无效,请参阅:。链接的答案全部归功于。这将允许更新基本docker映像中提交的层吗?写入这些随机字节的结果也会被缓存,因此如果在该命令之前没有文件发生更改,它将不会再次运行该命令。这并不能解决任何问题。似乎不再有效,只是在我的``ARG CACHEBUST=1`行下使用cache。。。(是的,我确实在docker命令中执行了
--build arg CACHEBUST=$(date+%s)
)也不适用于我,可能它依赖于平台。我希望任何ARG更改都会使缓存无效。您必须添加
运行echo“$CACHEBUST”
,因为仅使用
ARG
不会使缓存无效此答案解决了我的问题:如果random.org决定更改该端点,会发生什么?你将如何控制这种行为?@AndresLeonRangel承认,这不是Docker功能,而是一种使用Docker语法和知名web服务的黑客行为,已经存在了20多年,但你说得对,他们可能会反对该端点,事实上,现在看他们的文档,我甚至找不到“randbyte”他们有一个新的API,目前正在测试中。您可以1)继续使用此终结点,直到它失败;2)使用其新终结点(直到它失败);或3)编写自己的随机终结点,在这种情况下,您可以完全控制:)这失败了几次。。。当网站关闭时!!!我认为这不是一个完美的解决方案。添加失败:获取失败,状态为503服务不可用:random.org已添加DDOS保护,该保护现在会破坏此解决方案。该解决方案不起作用,并且给定的添加返回503。如果您不想阻塞管道,请不要使用此解决方案。请记住,当有重写时,这会中断
RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git

WORKDIR your_repository

# Calls for a random number to break the cahing of the git clone
# (https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull
ADD "https://api.github.com/repos/username/repo_name/commits?per_page=1" latest_commit
RUN curl -sLO "https://github.com/username/repo_name/archive/main.zip" && unzip main.zip