如何使用 docker builder prune 命令清理构建缓存

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker builder prune 命令有效地管理 Docker 构建缓存。我们将从构建一个简单的 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/pull("Pull Image from Repository") 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/pull -.-> lab-555043{{"如何使用 docker builder prune 命令清理构建缓存"}} docker/images -.-> lab-555043{{"如何使用 docker builder prune 命令清理构建缓存"}} docker/prune -.-> lab-555043{{"如何使用 docker builder prune 命令清理构建缓存"}} docker/build -.-> lab-555043{{"如何使用 docker builder prune 命令清理构建缓存"}} end

构建镜像以创建构建缓存

在这一步中,我们将构建一个简单的 Docker 镜像,以了解构建缓存是如何创建的。Docker 使用构建缓存来加速后续的构建过程。Dockerfile 中的每条指令都会创建一个层,如果自上次构建以来该指令没有发生变化,Docker 可以从缓存中重用现有的层。

首先,如果你还不在 ~/project 目录,请导航到该目录。

cd ~/project

现在,让我们创建一个简单的 Dockerfile。我们将其命名为 Dockerfile.cache

nano Dockerfile.cache

将以下内容添加到 Dockerfile.cache 文件中:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]

保存文件并退出 nano 编辑器(按 Ctrl + X,然后按 Y,再按 Enter)。

这个 Dockerfile 完成了以下操作:

  • FROM ubuntu:latest:以最新的 Ubuntu 基础镜像开始。
  • RUN apt-get update && apt-get install -y --no-install-recommends curl:更新软件包列表并安装 curl 软件包。这是一个常见的操作,如果基础镜像和这条指令没有变化,后续构建时很可能会使用缓存。
  • COPY . /app:将当前目录的内容复制到镜像中的 /app 目录。
  • WORKDIR /app:将工作目录设置为 /app
  • CMD ["curl", "https://www.example.com"]:指定从该镜像启动容器时要运行的命令。

在构建之前,让我们确保本地有 ubuntu:latest 镜像。如果没有,Docker 会在构建过程中自动拉取,但先显式地拉取有时可以使构建输出更清晰。

docker pull ubuntu:latest

现在,让我们使用 Dockerfile.cache 文件来构建镜像。我们将该镜像标记为 myimage:cachetest

docker build -t myimage:cachetest -f Dockerfile.cache .

你将看到指示构建过程步骤的输出。Docker 将执行 Dockerfile 中的每条指令。由于这是第一次使用这个 Dockerfile 进行构建,Docker 不会为这个 Dockerfile 中定义的层使用任何构建缓存。

构建完成后,你可以列出你的镜像,查看新创建的 myimage:cachetest

docker images

你应该会在列表中看到标签为 cachetestmyimage。这个构建过程为 Dockerfile.cache 中定义的每个层创建了构建缓存。在接下来的步骤中,我们将探索如何管理这个构建缓存。

清理悬空的构建缓存

在这一步中,你将学习如何清理悬空的构建缓存。悬空的构建缓存是指那些不再与任何命名镜像关联的构建缓存层。当你重新构建镜像,且之前的层被新层替换时,就会出现这种情况。清理悬空的缓存有助于释放磁盘空间。

首先,让我们对 Dockerfile.cache 做一些小修改,以创建一些悬空的缓存。我们将修改 RUN 指令。

如果你还不在 ~/project 目录,请导航到该目录。

cd ~/project

打开 Dockerfile.cache 文件进行编辑。

nano Dockerfile.cache

RUN 指令从:

RUN apt-get update && apt-get install -y --no-install-recommends curl

修改为:

RUN apt-get update && apt-get install -y --no-install-recommends wget

保存文件并退出 nano 编辑器(按 Ctrl + X,然后按 Y,再按 Enter)。

现在,让我们使用相同的标签重新构建镜像。

docker build -t myimage:cachetest -f Dockerfile.cache .

观察输出。Docker 可能会从缓存中重用 FROM 层,但由于 RUN 指令已更改,它将再次执行该步骤,从而创建一个新层。旧的 RUN 指令创建的前一个层现在成为了悬空的构建缓存,因为它不再是 myimage:cachetest 镜像的一部分。

要查看构建缓存,你可以使用 docker builder prune --dry-run 命令,不过如果没有更高级的工具或对 buildkit 输出的深入理解,通常很难专门区分出悬空的缓存。一个更简单的查看效果的方法是清理悬空的缓存,然后查看回收的空间。

要仅清理悬空的构建缓存,我们使用带有 --filter dangling=true 选项的 docker builder prune 命令。

docker builder prune --filter dangling=true

系统会提示你确认操作。输入 y 并按 Enter

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

输出将显示回收的空间大小。这些空间之前被不再需要的悬空构建缓存层占用。

通过清理悬空的构建缓存,你可以回收不再被任何活动镜像层使用的磁盘空间。

清理所有未使用的构建缓存

在这一步中,你将学习如何清理所有未使用的构建缓存。清理悬空缓存只是移除那些与任何镜像都不关联的层,而清理所有未使用的缓存则会移除当前未被运行中的容器使用或未被本地镜像引用的任何构建缓存。这是一种更激进的释放磁盘空间的方法。

首先,让我们使用另一个 Dockerfile 创建另一个镜像,以增加更多的构建缓存。

如果你还不在 ~/project 目录,请导航到该目录。

cd ~/project

创建一个名为 Dockerfile.another 的新 Dockerfile。

nano Dockerfile.another

将以下内容添加到 Dockerfile.another 中:

FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]

保存文件并退出 nano 编辑器(按 Ctrl + X,然后按 Y,再按 Enter)。

这个 Dockerfile 使用 alpine 基础镜像并安装 git

现在,使用这个新的 Dockerfile 构建一个镜像。我们将其标记为 anotherimage:latest

docker build -t anotherimage:latest -f Dockerfile.another .

这次构建将为这个 Dockerfile 创建新的构建缓存层。

要清理所有未使用的构建缓存,我们使用不带任何过滤器的 docker builder prune 命令。

docker builder prune -a

-a 标志代表“all”(全部),表示你要移除所有未使用的构建缓存,而不仅仅是悬空缓存。

系统会提示你确认操作。输入 y 并按 Enter

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

输出将显示回收的空间大小。此命令会移除当前未被本地镜像或运行中的容器引用的任何构建缓存层。这可以释放大量的磁盘空间,特别是在进行了多次构建和镜像更新之后。

请记住,清理所有未使用的缓存可能意味着,如果你本地仍有的镜像在后续构建时依赖于被移除的缓存层,构建时间可能会变长。

使用过滤器清理构建缓存

在这一步中,你将探索如何使用过滤器清理构建缓存。过滤器允许你根据特定条件选择性地移除构建缓存,让你对要移除的内容有更精细的控制。

你在前面的步骤中已经了解了 dangling=true 过滤器。另一个有用的过滤器是 until,它允许你移除在特定时间戳之前创建的构建缓存。

首先,让我们再次构建 myimage:cachetest 镜像,以确保有最新的构建缓存。

如果你还不在 ~/project 目录,请导航到该目录。

cd ~/project

再次构建镜像:

docker build -t myimage:cachetest -f Dockerfile.cache .

现在,让我们模拟一个场景,你想要移除早于某个时间的构建缓存。为了便于演示,我们将使用一个过滤器来移除几分钟前创建的缓存。

要移除早于特定时间的构建缓存,你可以使用 --filter until=<timestamp> 选项。时间戳可以有多种格式,包括像 5m(5 分钟)或 2h(2 小时)这样的时间段。

让我们移除 5 分钟前创建的构建缓存。

docker builder prune --filter until=5m

系统会提示你确认操作。输入 y 并按 Enter

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

输出将显示从 5 分钟前创建的构建缓存中回收的空间大小。如果你刚刚构建了镜像,可能没有太多超过 5 分钟的缓存,但在实际场景中,随着时间推移进行多次构建,这个过滤器对于清理旧缓存非常有用。

你还可以组合使用过滤器。例如,要移除早于某个时间的悬空缓存,你可以使用:

docker builder prune --filter dangling=true --filter until=24h

这将只移除超过 24 小时的悬空构建缓存。

使用过滤器可以灵活地管理构建缓存,并帮助你更有策略地释放磁盘空间。

在保留一定存储空间的同时清理构建缓存

在这一步中,你将学习如何在保留一定存储空间的同时清理构建缓存。当你想释放磁盘空间,但仍希望保留一些最近的构建缓存以加速未来的构建时,这种方法很有用。

docker builder prune 命令有一个 --keep-storage 选项,允许你指定要为构建缓存保留的最大存储量。你可以用字节指定大小,也可以使用 kmg 等单位。

首先,确保有一些构建缓存可供清理。你在前面的步骤中构建了镜像,这些操作会创建缓存。

如果你还不在 ~/project 目录,请导航到该目录。

cd ~/project

要在保留特定存储量的同时清理构建缓存,请使用 --keep-storage 选项,后跟所需的大小。例如,要最多保留 1GB 的构建缓存:

docker builder prune --keep-storage 1g

系统会提示你确认操作。输入 y 并按 Enter

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

输出将显示回收的空间大小。Docker 会移除最旧的构建缓存层,直到构建缓存的总大小低于指定的 --keep-storage 限制。

你可以根据可用磁盘空间和为了加快构建速度而希望保留的缓存量来调整 --keep-storage 的值。例如,要最多保留 500MB:

docker builder prune --keep-storage 500m

同样,输入 y 并按 Enter 确认操作。

这种方法在释放磁盘空间和保留一些构建缓存以提高性能之间取得了平衡。定期清理构建缓存以防止其占用过多磁盘空间是个好习惯。

总结

在这个实验中,你学习了如何使用 docker builder prune 命令来管理 Docker 构建缓存。首先,你使用 Dockerfile 构建了一个简单的 Docker 镜像,以此了解 Docker 如何创建和利用构建缓存来加速后续的构建过程。Dockerfile 中的每条指令都会创建一个层,如果指令没有变化,Docker 会从缓存中复用现有的层。

接着,你探索了不同的清理构建缓存的方法。你学习了如何清理悬空(dangling)构建缓存,即那些不再与任何构建相关联的缓存条目。你还了解了如何清理所有未使用的构建缓存,也就是有效地清除当前任何镜像都未使用的所有缓存条目。此外,你还演示了如何在 prune 命令中使用过滤器,根据特定条件选择性地移除构建缓存。最后,你探索了在保留与某些缓存条目相关联的存储空间的同时清理构建缓存的选项,这在特定场景中非常有用。