我在Dockerfile中有一些RUN命令,每次构建Docker映像时,我都希望使用-no-cache运行这些命令。

我理解docker构建——无缓存将禁用整个Dockerfile的缓存。

是否可以为特定的RUN命令禁用缓存?


当前回答

基于上面@Vladislav的解决方案,我在Dockerfile中使用了

ARG CACHEBUST=0

使构建缓存从此失效。

但是,不是传递日期或其他随机值,而是调用

docker build --build-arg CACHEBUST=`git rev-parse ${GITHUB_REF}` ...

其中GITHUB_REF是使用最新提交哈希的分支名称(例如main)。这意味着docker的构建缓存是无效的,只有从我构建映像的分支已经提交,因为上次运行docker构建。

其他回答

Use

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache

在RUN行之前,你想一直运行。这是因为ADD总是会获取文件/URL,并且上面的URL在每个请求上生成随机数据,然后Docker比较结果,看看它是否可以使用缓存。

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

截至2016年2月,这是不可能的。

该功能已在GitHub上提出请求

我相信这比@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提供了基本原则。

基于上面@Vladislav的解决方案,我在Dockerfile中使用了

ARG CACHEBUST=0

使构建缓存从此失效。

但是,不是传递日期或其他随机值,而是调用

docker build --build-arg CACHEBUST=`git rev-parse ${GITHUB_REF}` ...

其中GITHUB_REF是使用最新提交哈希的分支名称(例如main)。这意味着docker的构建缓存是无效的,只有从我构建映像的分支已经提交,因为上次运行docker构建。

该功能是一周前添加的。

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