Mac 上的 Docker 越用越占空间,PureMac 的清理按钮会删什么?

看清 Docker 清理连接的 daemon、prune 命令和停止容器的数据位置,清理前做好重建准备。

文章目录

开发项目停下来以后,Docker 的占用不会自动消失。反复构建镜像,也可能积累暂时用不上的对象。准备腾出空间时,先看占用来自镜像、容器还是数据卷。名称里带“缓存”,不代表其中的内容都可以重新下载。

PureMac 是用 SwiftUI 编写的开源 Mac 清理工具。它的 Docker 分类可以列出部分缓存和日志目录,也能调用 Docker 自身的清理命令。3.0.0 版本把这两类操作放在同一个分类里,选中前需要分别判断。

列表里有目录,也有一项 Docker 操作

PureMac 会检查若干固定位置,包括 ~/Library/Containers/com.docker.docker/Data 下的 cache、log、tmp,以及 ~/.docker/cli-plugins/.cache、~/.docker/buildx/cache。OrbStack 的部分日志和缓存也在扫描范围内。存在且有内容的目录才会进入结果;目录项的路径和大小可以帮助你判断要不要清理。

这些目录项默认勾选,常规清理会直接删除,不经过废纸篓。展开分类后先看路径,取消用途不明、仍在使用或需要留作排障记录的项。固定目录扫描也不代表已经找到所有 Docker 占用。

还有一项名称为 Docker prune (stopped containers, dangling images, build cache) 的结果。它没有对应的文件路径,默认不勾选。PureMac 找到 Docker CLI 且能读取空间信息时,才可能显示这项操作。其大小来自 docker system df 的可回收字段,清理时实际调用 docker system prune -f。这不是把某个目录放进废纸篓,也不能从废纸篓恢复被移除的 Docker 对象。实现细节见 3.0.0 源码。

先确认连接的是哪一个 Docker

Mac 上装着 Docker Desktop,不等于 Docker CLI 一定连接本机。有人同时用本地开发环境和远程服务器,切换过 context 后,后续命令可能仍然指向远程 daemon。PureMac 3.0.0 调用上述命令时没有显式指定本机 context,因此不能把它当成只清理这台 Mac 的按钮。

先在终端查看下面的信息,三条命令都只查询,不删除对象:

docker context show
docker system df
docker ps -a

第一条显示当前 context;第二条概览 daemon 的空间占用;第三条把已停止的容器也列出来。必要时再用 docker context ls 查看 endpoint,或用 docker context inspect 查看具体连接信息。

还要留意 DOCKER_HOST、DOCKER_CONTEXT 等环境变量,它们可以覆盖默认连接。终端与图形应用的启动环境也可能不同,终端结果不能单独证明 PureMac 的目标。如果不能确认它连接的是准备整理的开发环境,就不要选 Docker prune 项。Docker 的 context 文档解释了连接选择和覆盖规则。

已停止的容器,也可能保存着未备份的数据

docker system prune -f 会移除已停止的容器、未被容器使用的网络、悬空镜像和未使用的构建缓存。PureMac 的调用没有 -a,不会扩大到全部未使用镜像;也没有 --volumes,不清理数据卷。-f 跳过 Docker CLI 的交互确认,因此操作前需要自己完成判断。Docker 官方清理说明列出了各类对象的处理范围。

最容易误判的是已停止容器。停止只说明进程没有运行,容器自己的可写层还在。假如你把调试结果、数据库文件或临时修改直接写在容器内部,移除容器会一并丢掉这部分内容。重新用同一个镜像启动,只能得到新的容器,无法还原旧容器里的改动。

数据卷则有独立的生命周期,删除容器后卷中的数据可以继续存在。但“卷没删”也不等于新容器一定会自动接回原数据,重建时仍需使用正确的卷名称和挂载配置。检查项目的 Compose 文件或容器挂载信息,确认数据实际保存的位置;不能只凭服务叫 MySQL 或 PostgreSQL 就认为它用了卷。Docker 的卷文档说明了卷和容器可写层的区别。

清理前准备好重建所需的东西

建议先对照 docker ps -a 中的容器逐个确认:还有没有待取出的文件,项目是否保留了 Dockerfile、Compose 配置和启动参数,镜像是否能从仓库取得,数据库有没有可用备份。对无法重建或用途不明的停止容器,先保留。

构建缓存可以重新生成,但代价是下一次构建可能需要重新下载依赖、执行原先命中缓存的步骤。正赶着修复问题、网络不稳定,或依赖已经难以取得时,可以暂缓清理。日志目录也有用途:正在排查 Docker Desktop 或 OrbStack 故障时,先留下需要的记录,再处理目录项。

PureMac 的 Docker prune 项调用的是一次整体清理,不能在这项结果中挑出“只删某两个停止容器”。如果需要保留其中一部分,就先在 Docker 工具里逐项整理,别用这个按钮代替对象选择。

可回收数字不等于 Mac 立刻多出的空间

PureMac 3.0.0 将 docker system df 输出的各行可回收大小相加,作为虚拟条目的估算值。这些行可能包含本次命令不删除的数据卷,以及需要更大清理范围才能移除的镜像。因此,列表数字不能视为这次点击能释放的保证值。想进一步分辨占用,可以只读运行 docker system df -v,查看对象详情和镜像共享空间。命令说明提供了输出字段的含义。

Docker Desktop 还把 Linux 容器和镜像放在 Mac 上的磁盘映像里。映像的最大容量、实际占用与 Docker 内部统计是不同的数字,宿主机回收空间也可能需要等待。查看 Docker Desktop 的磁盘设置,关注实际占用;不要看到一个很大的 Docker.raw 就直接删除它。Docker Desktop 的 Mac FAQ说明了这些存储差异。

需要使用 PureMac 时,可从 3.0.0 发布页获取程序。开始扫描后先展开 Docker 分类,分别判断目录项和 prune 项;目标环境、容器数据与重建材料都明确了,再执行选中的操作。

继续阅读 · 开源工具 返回顶部