Docker Cache 机制

Docker cache 机制很大程度上做到了镜像的复用,降低存储空间的同时,还大大缩短了构建时间,但是cache是有文件有效性的,必须符合其规则。

  1. 层级构建:Docker 镜像是由一系列层(layers)组成的。每一层代表 Dockerfile 中的一条指令(例如 RUNCOPYADD 等)执行后的结果。
  2. 缓存复用:当你构建一个新的镜像时,Docker 会检查每一层是否已经存在于缓存中。如果存在,Docker 会直接使用缓存中的层,而不是重新执行对应的指令。
  3. 缓存失效:当 Dockerfile 中的某一条指令发生变化时,该指令及其之后的所有指令的缓存都会失效,Docker 会重新执行这些指令并生成新的层。

1. ADD 命令与 COPY 命令:Dockerfile 没有发生任何改变,但是命令ADD run.sh / 中 Dockerfile 当前目录下的 run.sh 却发生了变化,从而将直接导致镜像层文件系统内容的更新,原则上不应该再使用 cache。那么,判断 ADD 命令或者 COPY 命令后紧接的文件是否发生变化,则成为是否延用 cache 的重要依据。Docker 采取的策略是:获取 Dockerfile 下内容(包括文件的部分 inode 信息),计算出一个唯一的 hash 值,若 hash 值未发生变化,则可以认为文件内容没有发生变化,可以使用 cache 机制;反之亦然。


2. RUN 命令存在外部依赖:一旦 RUN 命令存在外部依赖,如RUN apt-get update,那么随着时间的推移,基于同一个基础镜像,一年的 apt-get update 和一年后的 apt-get update, 由于软件源软件的更新,从而导致产生的镜像理论上应该不同。如果继续使用 cache 机制,将存在不满足用户需求的情况。Docker 一开始的设计既考虑了外部依赖的问题,用户可以使用参数 --no-cache 确保获取最新的外部依赖,命令为:

docker build --no-cache -t image_name:tag .

何时清除Cache?

  1. 磁盘空间不足:当 Docker 宿主机的磁盘空间不足时,清除不再需要的缓存可以释放空间。
  2. 旧镜像不再使用:随着时间的推移,你可能会有很多不再使用的旧镜像和中间层。这些可以安全地删除。
  3. 构建缓存失效:有时,为了确保构建过程使用最新的依赖和代码,你可能需要清除缓存并重新构建镜像。
  4. 定期维护:作为系统维护的一部分,定期清理 Docker 缓存是一个好习惯。

如何清除Cache?

检查Docker磁盘使用情况

docker system df

[Docker] Docker容器的磁盘Cache清理_Docker

清理Docker build cache

此命令将用于清理磁盘、删除关闭的容器,无用的数据卷和网络,以及dangling镜像(没有tag的镜像),请确保所有关键容器都在运行running,否则将被自动删除,请谨慎操作。

docker builder prune

[Docker] Docker容器的磁盘Cache清理_Dockerfile_02

输入:y,删除完成

[Docker] Docker容器的磁盘Cache清理_prune_03

再次检查build缓存,占用空间为0B

[Docker] Docker容器的磁盘Cache清理_Cache_04