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 的出现,并不是为了重复造轮子,而是针对现有方案的几个痛点进行了精准改进:

  1. 粒度控制不足 docker system prune -a 会清理所有未使用的镜像、容器、网络和构建缓存,这是一把“火烧连营”的大刀。很多时候,我们只想清理特定项目(比如标签包含 test- 的)、特定时间之前(比如一周前)的,或者处于特定状态(比如 exited 超过3天)的资源。Clawon 通过丰富的过滤条件提供了这种外科手术式的精度。

  2. 安全性欠缺 :直接运行 prune 命令是有风险的,尤其是在脚本中。你可能一不小心就把还在用的中间镜像,或者某个暂时停止但还有数据的容器给删了。Clawon 强制性的 “预览(Preview)模式” 是其一大特色。任何清理操作前,它都会先列出所有符合筛选条件的待删除项,并明确提示资源数量及类型,需要用户确认(或通过 -f 强制跳过)才会执行。这相当于多了一道保险。

  3. 可集成性弱 :虽然可以写 Shell 脚本组合 docker 命令来实现复杂清理,但脚本的维护、可读性和跨平台一致性是个问题。Clawon 提供了一个统一的、配置化的命令行接口,它的筛选规则可以通过命令行参数或配置文件来定义,更容易嵌入到 CI/CD 流水线(如 GitLab CI、Jenkins)或定时任务(如 crontab)中,实现自动化治理。

  4. 资源关联性处理 :这是 Clawon 一个非常聪明的设计。Docker 资源之间存在依赖关系,例如,一个容器使用了某个镜像,一个网络被多个容器共享。粗暴删除可能会失败或留下“孤儿”资源。Clawon 在内部逻辑上会考虑这些关联性,例如,在删除镜像前,会确保没有容器依赖它(除非使用强制删除选项),这比手动写脚本处理要可靠得多。

2.2 Clawon 的核心架构与工作流程

Clawon 本身是一个用 Go 编写的单文件二进制工具,这带来了极好的分发和部署体验。它的架构可以理解为 “过滤器+执行器” 模式。

  1. 资源收集器 :首先,Clawon 会通过 Docker Engine API(和你使用 docker ps docker images 命令一样)获取当前主机上所有的目标资源列表,包括容器、镜像、网络和卷(Volume)。

  2. 规则过滤器 :这是核心环节。它根据用户提供的筛选条件(规则),对收集到的资源列表进行逐项过滤。这些规则是“与”的关系,即资源必须满足所有条件才会被选中。过滤过程是在内存中完成的,速度很快。

  3. 预览与确认 :过滤出的资源列表会以清晰易读的格式输出到终端,并统计数量。此时,Clawon 会暂停,等待用户确认。这个步骤是防止误操作的关键。

  4. 安全执行器 :用户确认后,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

这条命令会做以下几件事:

  1. containers :指定操作对象是容器。
  2. --filter state=exited :设置过滤条件,只筛选状态为“已退出”的容器。
  3. --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 语言效率很高,但在资源极其受限的环境或处理海量数据时,仍需注意:

  1. 分而治之 :不要试图用一条过于复杂的命令清理所有资源。可以按项目、按类型分批执行。例如,先清理 A 项目的旧容器,再清理 B 项目的。
  2. 善用时间过滤 created-before 是最有效的缩小范围的条件之一。优先使用它,可以大幅减少需要扫描和过滤的资源数量。
  3. 关注输出 :如果预览列表非常长,终端输出可能会卡顿。可以考虑将预览结果重定向到文件进行查看: 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,配置一个简单的每日清理任务,你会发现磁盘空间和心情都一起变好了。

更多推荐