我在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构建。

其他回答

在想要禁用缓存的区域之前,总是可以插入一些无意义且运行成本低的命令。

正如在本期评论中提出的,可以添加一个构建参数块(名称可以是任意的):

ARG CACHEBUST=1 

并在每次运行时通过添加——build-arg CACHEBUST=$(date +%s)作为docker构建参数来修改它的值(value也可以是任意的,这里是current datetime,以确保它在不同运行时的唯一性)。

当然,这也会禁用所有后续块的缓存,因为中间映像的哈希和将是不同的,这使得真正的选择性缓存禁用成为一个不平凡的问题,考虑到docker当前的工作方式。

另一种快速的破解方法是在命令之前写一些随机字节

RUN head -c 5 /dev/random > random_bytes && <run your command>

写出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"

https://github.com/moby/moby/issues/1996#issuecomment-550020843

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

ARG CACHEBUST=0

使构建缓存从此失效。

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

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

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

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

该功能已在GitHub上提出请求