每次构建Docker映像时RUN
,我都希望在Dockerfile中运行一些命令-no-cache
。
我了解docker build --no-cache
将禁用整个Dockerfile的缓存。
是否可以为特定的RUN命令禁用缓存?
Answers:
总是有一个选项可以在要禁用缓存的区域之前插入一些无意义且运行廉价的命令。
如本期评论中所建议,可以添加一个构建参数块(名称可以是任意的):
ARG CACHEBUST=1
在此区域之前,并通过添加--build-arg CACHEBUST=$(date +%s)
作为docker build
参数来修改每次运行的值(值也可以是任意的,这里是当前日期时间,以确保其在每次运行中的唯一性)。
当然,这也会禁用所有后续块的缓存,因为中间映像的哈希值将有所不同,这考虑到docker当前的工作方式,从而使真正的选择性缓存禁用了一个重要的问题。
---> Using cache
我的``ARG CACHEBUST = 1`行...(是的,我确实--build-arg CACHEBUST=$(date +%s)
在我的
RUN echo "$CACHEBUST"
因为仅使用ARG
将不会使缓存无效
采用
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
您要始终在RUN行之前运行。之所以可行,是因为ADD将始终获取文件/ URL,并且上述URL会在每个请求上生成随机数据,然后Docker比较结果以查看其是否可以使用缓存。
我也对此进行了测试,并且效果很好,因为它不需要任何其他Docker命令行参数,并且还可以从Docker-compose.yaml文件中进行工作:)
该功能是一周前添加的。
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"
https://github.com/moby/moby/issues/1996#issuecomment-550020843
我相信,这与上述@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
# (/programming/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提供了基本原理。