Docker资源精准清理工具Clawon:从原理到CI/CD集成的完整指南
1. 项目概述:一个被“遗忘”的宝藏工具
最近在整理自己的开发工具链时,又翻出了
aazirani/clawon
这个项目。说实话,第一次看到这个仓库名,我也有点懵——“clawon”?这既不像一个常见的英文单词,也不像某个流行框架的缩写。但点进去看源码和文档,你会发现它其实是一个设计相当精巧、解决了一个非常具体且高频痛点的命令行工具。简单来说,
Clawon 是一个用于快速、安全地清理 Docker 系统资源的命令行工具
。
如果你和我一样,日常开发、测试甚至生产环境都重度依赖 Docker,那你一定对下面这个场景不陌生:本地机器上跑着十几个不同的项目容器,每个项目又有自己的数据库、缓存、网络;CI/CD 流水线每天构建几十个临时镜像;时间一长,
docker ps -a
列出的列表长得吓人,
docker images
里堆满了
<none>
的中间镜像和旧版本镜像,磁盘空间被一点点蚕食。手动清理?
docker system prune
太粗暴,怕误删;写脚本?每次都要斟酌过滤条件,挺麻烦。Clawon 就是在这个背景下诞生的,它不是一个要取代
docker system prune
的巨无霸,而是一个更智能、更可控的“外科手术刀”。
它的核心价值在于 “精准”和“安全” 。它允许你通过非常灵活的规则(比如时间、标签、名称模式、状态)来筛选出需要清理的资源,并且提供预览模式,让你在真正执行删除前,清楚地知道哪些东西会被动。这对于维护一个干净、高效的 Docker 工作环境至关重要,尤其是对于团队协作和自动化脚本集成。接下来,我就结合自己近一年的使用经验,从设计思路到实操细节,把这个“宝藏工具”彻底讲透。
2. 核心设计理念与竞品对比
2.1 为什么需要另一个 Docker 清理工具?
Docker 官方和社区已经有不少清理方案,比如自带的
docker system prune
, 第三方工具如
docker-gc
、
docker-cleanup
等。Clawon 的出现,并不是为了重复造轮子,而是针对现有方案的几个痛点进行了精准改进:
-
粒度控制不足 :
docker system prune -a会清理所有未使用的镜像、容器、网络和构建缓存,这是一把“火烧连营”的大刀。很多时候,我们只想清理特定项目(比如标签包含test-的)、特定时间之前(比如一周前)的,或者处于特定状态(比如exited超过3天)的资源。Clawon 通过丰富的过滤条件提供了这种外科手术式的精度。 -
安全性欠缺 :直接运行
prune命令是有风险的,尤其是在脚本中。你可能一不小心就把还在用的中间镜像,或者某个暂时停止但还有数据的容器给删了。Clawon 强制性的 “预览(Preview)模式” 是其一大特色。任何清理操作前,它都会先列出所有符合筛选条件的待删除项,并明确提示资源数量及类型,需要用户确认(或通过-f强制跳过)才会执行。这相当于多了一道保险。 -
可集成性弱 :虽然可以写 Shell 脚本组合
docker命令来实现复杂清理,但脚本的维护、可读性和跨平台一致性是个问题。Clawon 提供了一个统一的、配置化的命令行接口,它的筛选规则可以通过命令行参数或配置文件来定义,更容易嵌入到 CI/CD 流水线(如 GitLab CI、Jenkins)或定时任务(如 crontab)中,实现自动化治理。 -
资源关联性处理 :这是 Clawon 一个非常聪明的设计。Docker 资源之间存在依赖关系,例如,一个容器使用了某个镜像,一个网络被多个容器共享。粗暴删除可能会失败或留下“孤儿”资源。Clawon 在内部逻辑上会考虑这些关联性,例如,在删除镜像前,会确保没有容器依赖它(除非使用强制删除选项),这比手动写脚本处理要可靠得多。
2.2 Clawon 的核心架构与工作流程
Clawon 本身是一个用 Go 编写的单文件二进制工具,这带来了极好的分发和部署体验。它的架构可以理解为 “过滤器+执行器” 模式。
-
资源收集器 :首先,Clawon 会通过 Docker Engine API(和你使用
docker ps、docker images命令一样)获取当前主机上所有的目标资源列表,包括容器、镜像、网络和卷(Volume)。 -
规则过滤器 :这是核心环节。它根据用户提供的筛选条件(规则),对收集到的资源列表进行逐项过滤。这些规则是“与”的关系,即资源必须满足所有条件才会被选中。过滤过程是在内存中完成的,速度很快。
-
预览与确认 :过滤出的资源列表会以清晰易读的格式输出到终端,并统计数量。此时,Clawon 会暂停,等待用户确认。这个步骤是防止误操作的关键。
-
安全执行器 :用户确认后,Clawon 开始执行删除操作。它不是简单粗暴地并发删除,而是遵循一定的安全顺序(例如,先尝试删除容器,再删除其关联的镜像),并在删除每个资源前进行最后一次存在性检查,避免在预览和执行的间隙资源状态发生变化导致的错误。
整个流程如下图所示(逻辑描述):
用户输入命令及过滤规则 -> Clawon调用Docker API获取资源 -> 应用过滤规则 -> 生成待删除预览列表 -> 用户确认 -> 按安全顺序执行删除 -> 输出结果报告
注意 :Clawon 的所有操作都是基于 Docker API 的,这意味着你需要有相应的 Docker 守护进程访问权限。在生产环境使用时要特别注意权限控制,最好限制在特定的、受信任的用户或服务账户下运行。
3. 安装与快速上手
3.1 多种安装方式
Clawon 的安装非常灵活,适合不同场景:
方式一:直接下载二进制文件(推荐)
这是最快捷的方式。前往项目的 GitHub Releases 页面,根据你的操作系统和架构下载对应的
clawon
二进制文件。比如在 Linux x86_64 上:
# 下载最新版本
wget https://github.com/aazirani/clawon/releases/latest/download/clawon-linux-amd64 -O clawon
# 添加执行权限
chmod +x clawon
# 移动到系统路径(可选,方便全局调用)
sudo mv clawon /usr/local/bin/
验证安装:
clawon --version
。
方式二:通过包管理器 对于 macOS 用户,如果安装了 Homebrew,可以将其添加到自定义 Tap 后安装(具体请参考项目 README,可能不是官方维护)。Linux 用户也可以将其放入自定义的 apt/yum 仓库。
方式三:从源码构建 如果你需要修改代码或针对特定环境编译:
git clone https://github.com/aazirani/clawon.git
cd clawon
make build # 或者 go build -o clawon main.go
这需要你的机器上安装有 Go 开发环境(1.16+)。
3.2 你的第一次清理:一个安全演示
安装完成后,我们不做任何危险操作,先来一次完全安全的“预览”体验,看看 Clawon 能发现什么。
# 预览所有已退出的容器
clawon containers --filter state=exited --preview
这条命令会做以下几件事:
-
containers:指定操作对象是容器。 -
--filter state=exited:设置过滤条件,只筛选状态为“已退出”的容器。 -
--preview:关键参数!它告诉 Clawon 只进行预览,不执行实际删除。
执行后,终端会输出一个列表,显示所有匹配的容器 ID、名称、镜像、创建时间和状态。最后一行会总结,例如:
Preview: 5 containers would be removed.
。看到这个,你就知道如果执行删除,会动哪5个容器。
在真正熟悉之前,永远先加上
--preview
跑一遍。
实操心得 :我习惯在编写自动化脚本时,将第一次运行设置为
--preview模式,并将输出记录到日志。确认无误后,再移除--preview或添加--force(跳过确认提示)进行正式清理。这能有效避免在 CI/CD 环境中因镜像标签变更等意外情况导致的误删。
4. 核心功能深度解析与实战
Clawon 的强大在于其丰富的过滤条件。下面我们分资源类型,结合实战场景,详细拆解。
4.1 容器清理:从简单到复杂
容器是我们最常清理的资源。Clawon 提供了多种维度的过滤。
场景一:清理所有已退出的临时容器
这是最基本的需求。开发调试时,经常用
docker run -it --rm
跑临时容器,但有时忘记加
--rm
,或者容器异常退出,就会留下一堆
Exited
状态的容器。
# 预览并清理所有已退出容器
clawon containers --filter state=exited --preview
# 确认列表无误后,执行删除(会要求确认)
clawon containers --filter state=exited
# 或者强制删除(跳过确认提示,用于脚本)
clawon containers --filter state=exited --force
场景二:清理指定时间之前创建的旧容器 比如,你想清理一周前创建的所有容器(无论状态)。
# 清理创建时间早于7天前的所有容器
clawon containers --filter created-before=7d
时间单位支持
s
(秒),
m
(分钟),
h
(小时),
d
(天),
w
(周)。
created-before=168h
和
7d
是等价的。
场景三:按名称或标签过滤
这是精准清理的关键。假设你的项目容器名称都包含
myapp-
前缀,并且用标签
env=staging
来标记测试环境容器。
# 清理名称包含‘myapp-’且已退出的容器
clawon containers --filter name=myapp- --filter state=exited
# 清理所有带有标签 env=staging 的容器
clawon containers --filter label=env=staging
# 组合条件:清理 staging 环境下,创建超过3天的已退出容器
clawon containers --filter label=env=staging --filter state=exited --filter created-before=3d
注意事项 :
--filter参数可以多次使用,它们之间是 “逻辑与(AND)” 的关系。上面的例子中,容器必须同时满足“有标签env=staging”、“状态为exited”、“创建于3天前”这三个条件才会被选中。如果你需要“或(OR)”逻辑,目前需要运行多次命令。
4.2 镜像清理:解决磁盘空间难题
Docker 镜像占用的磁盘空间通常是最大的。Clawon 的镜像清理功能非常实用。
场景一:清理所有悬虚(dangling)镜像
悬虚镜像是那些没有标签(显示为
<none>:<none>
)的中间构建层。它们通常是无用的。
clawon images --filter dangling=true
这等价于
docker image prune
,但同样有预览和安全确认。
场景二:清理未被任何容器引用的镜像
这比
dangling
范围更广,包括那些有标签但当前没有任何容器(无论运行还是停止)使用的镜像。
clawon images --filter unused=true
这是一个需要谨慎使用的选项
,尤其是在生产环境。因为有些镜像可能是基础镜像,或者准备下次部署用的。务必先
--preview
。
场景三:按模式清理特定镜像
比如,清理所有仓库名包含
test-registry.com/
的镜像,或者所有标签为
latest
的旧镜像(保留最新的一个)。
# 清理来自特定私有仓库的所有镜像
clawon images --filter reference=test-registry.com/*
# 注意:Clawon 可能不直接支持‘保留最新N个’的语义,这通常需要结合其他工具或脚本。
# 更常见的做法是清理特定标签模式,如所有以‘-dev’结尾的标签
clawon images --filter reference=*:*-dev --filter created-before=2d
场景四:综合清理——释放最大空间 一个常见的维护任务是:清理所有悬虚镜像 + 清理所有创建超过30天且未被使用的镜像。
# 分两步执行更安全
clawon images --filter dangling=true
clawon images --filter unused=true --filter created-before=30d
4.3 网络与卷的清理
网络和卷的清理相对较少,但同样重要,特别是对于自动化的测试环境。
网络清理 :Docker 会自动创建一些默认网络(bridge, host, none),自定义的未使用网络可以清理。
# 清理所有未被任何容器使用的自定义网络
clawon networks --filter unused=true
注意 :这不会删除正在被容器使用的网络,也不会删除 Docker 的默认网络。
卷清理 :数据卷(Volume)存储着持久化数据,清理必须格外小心。Clawon 通常只清理未被任何容器引用的“悬虚卷”。
# 预览并清理所有悬虚卷
clawon volumes --filter dangling=true --preview
重要警告 :卷清理是最高风险操作!一个“悬虚”的卷可能包含重要的数据库备份、上传的文件等。在执行
volumes清理前, 必须 使用--preview仔细核对列表,并确保你有其他备份或确认这些数据确实不再需要。我个人的策略是,除非磁盘空间告急,否则几乎从不自动化清理卷,而是手动处理。
4.4 使用配置文件进行批量操作
对于固定的清理策略,每次都敲一长串命令很麻烦,也容易出错。Clawon 支持使用 YAML 或 JSON 格式的配置文件。
创建一个
cleanup-policy.yaml
文件:
# cleanup-policy.yaml
version: '1'
policies:
- name: "daily-container-cleanup"
resource: "containers"
filters:
- "state=exited"
- "created-before=1d"
action: "delete"
force: false # 是否跳过确认
- name: "weekly-image-cleanup"
resource: "images"
filters:
- "dangling=true"
- "unused=true"
- "created-before=7d"
action: "delete"
force: false
- name: "aggressive-test-cleanup"
resource: "all" # 同时清理容器、镜像、网络、卷
filters:
- "label=environment=ci"
- "created-before=2h"
action: "delete"
force: true # 在CI环境中,我们通常跳过确认
然后运行:
clawon --config cleanup-policy.yaml --policy daily-container-cleanup --preview
clawon --config cleanup-policy.yaml --policy aggressive-test-cleanup
通过配置文件,你可以将清理策略代码化、版本化,并在不同环境(开发、测试、CI)中应用不同的策略,实现标准化运维。
5. 集成到自动化流程:CI/CD 与定时任务
Clawon 的真正威力在于自动化。手动运行只是小打小闹,把它集成到系统中才能持续发挥价值。
5.1 集成到 GitLab CI/CD
假设你在 GitLab 上运行 CI,每次流水线都会构建新的镜像并运行测试容器。你可以在流水线最后添加一个清理阶段,专门清理本次流水线产生的资源。
# .gitlab-ci.yml
stages:
- build
- test
- cleanup
cleanup_job:
stage: cleanup
script:
# 安装 clawon
- curl -L -o clawon https://github.com/aazirani/clawon/releases/latest/download/clawon-linux-amd64 && chmod +x clawon
# 清理所有由本次流水线创建的、带有当前CI流水线ID标签的资源
# 假设你在构建和测试阶段为所有资源打上了标签 `ci-job=$CI_JOB_ID`
- ./clawon containers --filter label=ci-job=$CI_JOB_ID --force
- ./clawon images --filter label=ci-job=$CI_JOB_ID --force
rules:
- when: always # 无论成功失败,都执行清理
这样,每次流水线结束后,无论成功与否,都会自动清理自己产生的“垃圾”,保持 Runner 节点的清洁。
5.2 通过 Systemd Timer 或 Crontab 设置定时清理
对于开发机或长期运行的服务器,可以设置定时任务,执行日常或每周清理。
使用 Systemd Timer (Linux)
创建服务文件
/etc/systemd/system/clawon-daily.service
:
[Unit]
Description=Daily Docker cleanup with Clawon
After=docker.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/clawon containers --filter state=exited --filter created-before=2d --force
ExecStart=/usr/local/bin/clawon images --filter dangling=true --force
ExecStart=/usr/local/bin/clawon images --filter unused=true --filter created-before=30d --force
# 注意:这里没有清理 volumes,因为风险高
创建定时器文件
/etc/systemd/system/clawon-daily.timer
:
[Unit]
Description=Run daily Docker cleanup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
然后启用:
sudo systemctl enable --now clawon-daily.timer
使用 Crontab 更传统的方式,在 crontab 中添加一行:
# 每天凌晨3点,执行清理脚本
0 3 * * * /usr/local/bin/clawon containers --filter state=exited --filter created-before=2d --force >> /var/log/clawon.log 2>&1
实操心得 :在自动化脚本中使用
--force参数跳过确认是必要的,但必须确保你的过滤条件 绝对精确 。我建议先在目标机器上以--preview模式运行一段时间(比如一周),每天检查日志,确认筛选结果符合预期,然后再切换到--force模式。同时,将清理操作的重度(如清理周期、保留天数)设置得相对保守一些,宁松勿紧。
6. 高级技巧与疑难排查
6.1 过滤条件的组合与转义
过滤条件是 Clawon 的灵魂。理解其语法细节能让你事半功倍。
-
空格处理
:如果过滤值包含空格,需要用引号包裹。
# 错误:clawon containers --filter name=my app # 正确:clawon containers --filter name="my app" -
通配符
:
*支持有限,主要在reference(镜像引用)过滤中比较有用,如--filter reference=myrepo/*:latest。 -
时间计算
:
created-before和created-after非常强大。你可以使用绝对时间戳,但相对时间更常用。7d表示7天,12h表示12小时。Clawon 会将其转换为绝对时间与资源的CreatedAt时间戳进行比较。 -
标签过滤
:
--filter label=key=value是精确匹配。如果你想匹配所有带有某个键(无论值是什么)的资源,可以使用--filter label=key。注意,label过滤对镜像、容器、网络都有效。
6.2 性能考量与处理大量资源
当你的 Docker 宿主机上有成千上万个镜像或容器时,Clawon 的预览和过滤操作可能会消耗一定内存和 CPU。虽然 Go 语言效率很高,但在资源极其受限的环境或处理海量数据时,仍需注意:
- 分而治之 :不要试图用一条过于复杂的命令清理所有资源。可以按项目、按类型分批执行。例如,先清理 A 项目的旧容器,再清理 B 项目的。
-
善用时间过滤
:
created-before是最有效的缩小范围的条件之一。优先使用它,可以大幅减少需要扫描和过滤的资源数量。 -
关注输出
:如果预览列表非常长,终端输出可能会卡顿。可以考虑将预览结果重定向到文件进行查看:
clawon ... --preview > preview_result.txt。
6.3 常见问题与解决方案
问题1:执行删除时提示“资源不存在”或“删除失败”。
- 原因 :在预览和实际执行删除的间隙,目标资源可能已被其他进程(如另一个 Docker 命令、容器自动重启等)删除或状态改变。
- 解决方案 :这是 Clawon 安全机制的一部分,可以忽略。Clawon 会跳过这些资源并继续处理其他项。如果频繁出现,可能是你的清理策略与其他自动化流程有冲突,需要协调。
问题2:如何清理“所有资源”(容器、镜像、网络、卷)?
-
方法
:使用
clawon all命令。但 极度危险 !务必结合严格的过滤条件,并先预览。# 危险!这将尝试清理所有未被使用的资源,包括可能重要的数据卷。 # clawon all --filter unused=true --preview # 相对安全:清理所有已退出超过一周的容器、所有悬虚镜像和网络。 clawon all --filter state=exited --filter created-before=7d --filter dangling=true --preview
问题3:Clawon 和 Docker 自带的 prune 命令,我该用哪个?
-
简单、快速、粗暴的清理
:用
docker system prune -a --volumes(注意--volumes会删卷!)。适合在确定不需要任何闲置资源时使用。 - 精准、安全、可审计、可自动化的清理 :用 Clawon。你需要对清理对象有明确的选择标准,并希望集成到脚本或流程中。
问题4:Clawon 能否在 Docker Swarm 或 Kubernetes 集群中使用?
- 答案 :Clawon 直接与单个 Docker 守护进程通信。在 Docker Swarm 模式下,它只能管理当前节点上的资源,无法跨节点操作。对于 Kubernetes,它无法直接管理 Pod 和 Kubernetes 对象。它更适合用于管理开发机、CI Runner 节点或单个 Docker 主机上的资源。对于集群环境的镜像清理,可能需要结合集群的垃圾回收机制或使用专门的集群管理工具。
经过一段时间的深度使用,Clawon 已经成了我本地开发和维护测试服务器不可或缺的工具。它的设计哲学我很欣赏:不追求大而全,而是把一个痛点(精准安全清理)打透。最开始你可能觉得它只是
docker system prune
的语法糖,但当你开始用过滤规则组合出复杂的清理策略,并把它嵌入到你的自动化流程里时,你会体会到那种“一切尽在掌握”的清爽感。尤其是那个
--preview
功能,让我在写自动化脚本时心里特别踏实。如果你也受困于 Docker 环境的杂乱,不妨花半小时试试 Clawon,配置一个简单的每日清理任务,你会发现磁盘空间和心情都一起变好了。
更多推荐
所有评论(0)