我可以从 docker 中删除单个层以防止缓存吗?

Att*_*igh 16 caching build docker

我有一个长时间运行的 docker 构建过程,所以我不想禁用整个构建的缓存(使用--no-cache)。但是,我想使特定步骤的缓存无效。

我有一个好主意:删除缓存层并重建,因此必须重建。

我用了:

docker build --progress=plain
Run Code Online (Sandbox Code Playgroud)

获取缓存层的 sha:

#16 [stage-9  3/15] RUN pip install -r /tmp/requirements.lock
#16 sha256:e4ac79a1eac5702cd296ccf33a1cfa2e0c3890c77d42737dc62a3b26ac3e798e
#16 CACHED
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个错误

> docker rmi e4ac79a1eac5702cd296ccf33a1cfa2e0c3890c77d42737dc62a3b26ac3e798
Error: No such image: e4ac79a1eac5702cd296ccf33a1cfa2e0c3890c77d42737dc62a3b26ac3e798
Run Code Online (Sandbox Code Playgroud)

有没有一种(简单)方法删除该层?

注意:对于大多数用例(甚至可能是这个),您可能希望使用--no-cache选项docker build

iOS*_*com 8

不直接可能。但可以通过对 docker 文件进行一些更改来完成。

要强制破坏缓存,可以使用“构建时参数”(ARG);更改该参数的值会破坏缓存及其后的每一步,例如:

FROM something
RUN apt-get update && apt-get install foo bar baz ......

ARG CACHE_DATE=2016-01-01

# steps below will always be executed if `CACHE_DATE` is changed to a unique value
RUN blablabla
Run Code Online (Sandbox Code Playgroud)

并在构建期间为 CACHE_DATE 设置新日期:

docker build --build-arg CACHE_DATE="$(date)" ....
Run Code Online (Sandbox Code Playgroud)

详细信息直接取自此 github 问题


Fua*_*ein 1

也许你可以通过这个命令删除:

docker rm e4ac79a1eac5702cd296ccf33a1cfa2e0c3890c77d42737dc62a3b26ac3e798
Run Code Online (Sandbox Code Playgroud)

因为您仍然使用相同的映像和不同的容器。

  • “docker rm”抱怨“没有这样的容器”。 (6认同)