如何使用 docker buildx prune 命令管理构建缓存

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索如何使用 docker buildx prune 命令有效管理 Docker 构建缓存。构建缓存是通过复用先前构建的镜像层来加速 Docker 镜像构建的关键机制。然而随着时间的推移,这些缓存会不断累积并占用大量磁盘空间。

我们将首先构建一个简单的 Docker 镜像来生成一些构建缓存。然后演示使用 docker buildx prune 清理缓存的各种方法,包括:无筛选条件地清理所有缓存、使用 --filter 选项选择性清理同时保留近期数据、通过 --keep-storage 限制缓存大小,以及最终使用 --all 标志清理包括内部镜像在内的所有构建缓存。完成本实验后,你将掌握高效管理 Docker 构建缓存的实用技巧。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/images -.-> lab-555061{{"如何使用 docker buildx prune 命令管理构建缓存"}} docker/prune -.-> lab-555061{{"如何使用 docker buildx prune 命令管理构建缓存"}} docker/build -.-> lab-555061{{"如何使用 docker buildx prune 命令管理构建缓存"}} end

构建镜像以创建构建缓存

在本步骤中,我们将构建一个简单的 Docker 镜像来创建一些构建缓存。Docker 构建缓存是一种通过复用先前构建的镜像层来加速构建过程的机制。当你构建 Docker 镜像时,Dockerfile 中的每条指令都会创建一个镜像层。如果某条指令自上次构建后未发生变化,Docker 就可以复用现有镜像层而无需重新构建。

首先,我们为项目创建目录并进入该目录:

mkdir ~/project/docker-cache-demo
cd ~/project/docker-cache-demo

现在创建一个简单的 Dockerfile,该文件会将一个文件复制到镜像中并执行命令:

nano Dockerfile

Dockerfile 中添加以下内容:

FROM ubuntu:latest
COPY . /app
RUN echo "Hello, Docker Cache!" > /app/message.txt
CMD ["cat", "/app/message.txt"]

保存并关闭文件。

接着创建一个将被复制到镜像中的简单文件:

nano message.txt

message.txt 中添加以下内容:

This is a test message.

保存并关闭文件。

现在我们将构建 Docker 镜像,并将镜像标记为 cache-demo

docker build -t cache-demo .

你将看到输出显示 Docker 正在逐步构建镜像,每个步骤对应 Dockerfile 中的一条指令。如果本地不存在 ubuntu:latest 镜像,Docker 会先下载该镜像,然后复制 message.txt 文件并执行 echo 命令。

构建完成后,可以通过列出可用镜像来验证镜像是否创建成功:

docker images

你应该能在镜像列表中看到 cache-demo

现在,在不修改 Dockerfile 或 message.txt 的情况下再次构建镜像:

docker build -t cache-demo .

这次你会发现构建过程快得多。由于 Dockerfile 中的指令和 message.txt 的内容都没有变化,Docker 复用了先前构建的镜像层。输出中大部分步骤会显示 "Using cache",这演示了 Docker 构建缓存如何加速后续构建过程。

无筛选条件清理构建缓存

在本步骤中,我们将学习如何在不使用任何筛选条件的情况下清理 Docker 构建缓存。清理构建缓存可以通过移除未使用的缓存条目来释放磁盘空间。

清理构建缓存的命令是 docker builder prune。默认情况下,该命令会删除所有未被现有镜像使用的构建缓存条目。

让我们执行命令来清理构建缓存:

docker builder prune

系统将提示你确认操作。输入 y 并按 Enter 键继续:

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

输出结果将显示被删除的构建缓存条目以及回收的空间总量。

为了观察清理效果,让我们尝试重新构建镜像:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

这次构建过程可能比上一步中的第二次构建耗时更长,因为部分或全部构建缓存可能已被移除。Docker 将重新构建那些被清理的镜像层。

当你想通过清理所有未使用的构建缓存来最大化可用磁盘空间时,无筛选条件的清理方式非常有用。但如果你需要频繁重建镜像,这可能会影响后续构建的速度。在接下来的步骤中,我们将探索如何使用筛选条件来更精确地控制哪些构建缓存条目需要被清理。

使用 --filter 参数保留近期数据清理构建缓存

在本步骤中,我们将学习如何使用 --filter 参数在清理 Docker 构建缓存的同时保留近期数据。当你希望释放磁盘空间,同时又想保留近期构建的缓存时,这个方法非常实用。

docker builder prune 命令支持多种筛选条件。其中 until 筛选器特别有用,它允许你移除早于特定时间戳的构建缓存条目。时间戳可以是具体的日期时间,也可以是相对于当前时间的时长。

首先让我们重新构建镜像,确保拥有一些近期构建缓存:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

现在,我们来清理构建缓存,但保留最近 5 分钟内的条目。可以使用 until 筛选器配合时长参数 5m

docker builder prune --filter "until=5m"

系统将提示你确认操作。输入 y 并按 Enter 键继续:

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

输出结果将显示被删除的构建缓存条目。只有超过 5 分钟的旧条目会被移除。

你也可以指定具体的时间戳。例如,要移除早于特定日期时间的缓存条目,可以使用 "YYYY-MM-DDTHH:MM:SS" 这样的格式。

使用带时长参数的 until 筛选器是一种便捷的方式,可以在清理旧缓存条目的同时保留最近的构建缓存,从而平衡磁盘空间使用和构建速度。

使用 --keep-storage 参数保留特定大小的构建缓存

在本步骤中,我们将学习如何使用 --keep-storage 参数在清理 Docker 构建缓存的同时保留特定大小的存储空间。当你需要限制构建缓存占用的磁盘空间时,这个方法非常实用。

--keep-storage 参数的 docker builder prune 命令允许你指定构建缓存的最大保留空间。Docker 会删除最旧的构建缓存条目,直到剩余缓存的总大小低于指定限制。

首先让我们多次构建镜像以创建更多缓存条目:

cd ~/project/docker-cache-demo
docker build -t cache-demo:v1 .
docker build -t cache-demo:v2 .

现在,我们来清理构建缓存,仅保留 1GB 存储空间。你可以使用字节(bytes)、千字节(k)、兆字节(m)或吉字节(g)来指定大小:

docker builder prune --keep-storage 1g

系统将提示你确认操作。输入 y 并按 Enter 键继续:

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

输出结果将显示被删除的构建缓存条目以及回收的空间总量。Docker 会持续删除最旧的缓存条目,直到剩余缓存总大小约为 1GB 或更少。

使用 --keep-storage 参数是管理构建缓存占用磁盘空间的有效方法,特别适用于存储空间有限的环境。

使用 --all 参数清理所有构建缓存(包括内部镜像)

在本步骤中,我们将学习如何使用 --all 参数彻底清理 Docker 构建缓存,包括所有内部镜像。这是最彻底的清理方式,将移除所有缓存条目,无论它们是否被现有镜像使用。

--all 参数(简写为 -a)的 docker builder prune 命令会移除所有构建缓存条目,包括未打标签的中间构建镜像关联的缓存。

让我们执行命令清理所有构建缓存:

docker builder prune --all

系统将提示你确认操作。输入 y 并按 Enter 键继续:

WARNING! This will remove all build cache.
Are you sure you want to continue? [y/N] y

输出结果将显示所有被删除的构建缓存条目以及回收的空间总量。与不使用 --all 参数或使用筛选器相比,此命令通常能释放最多的磁盘空间。

执行此命令后,如果你再次构建 cache-demo 镜像,所需时间可能会显著增加,因为所有构建缓存已被移除,Docker 需要重新构建所有层级:

cd ~/project/docker-cache-demo
docker build -t cache-demo .

当需要尽可能释放磁盘空间,或希望确保全新构建而不依赖任何现有缓存时,使用 docker builder prune --all 非常有效。但请注意,这会导致后续构建速度明显下降,直到生成新的缓存为止。

总结

在本实验中,我们学习了如何使用 docker buildx prune 命令管理 Docker 构建缓存。我们首先构建了一个简单的 Docker 镜像来生成构建缓存,观察 Docker 如何复用层级以加速后续构建。

随后我们探索了多种清理构建缓存的方法:学习了如何无筛选地清理所有构建缓存、如何使用 --filter 选项保留近期缓存数据、如何通过 --keep-storage 限制缓存大小,以及最终如何使用 --all 参数彻底清理包括内部镜像在内的所有构建缓存。这些技术对于管理磁盘空间和优化构建环境至关重要。