Skip to content

Commit 46313ba

Browse files
committed
feat(docker-image-cleanup): 增加 fzf 交互式多选与依赖检查
在 Docker 镜像清理脚本中集成 fzf 交互式选择功能,允许用户从候选镜像中精确选择删除目标。当 fzf 未安装时,脚本将快速失败并输出明确的安装指引,避免隐式降级导致的误删风险。 更新相关设计文档、任务清单和提案,以反映新增的功能需求和实现细节。
1 parent 90f2db4 commit 46313ba

4 files changed

Lines changed: 59 additions & 23 deletions

File tree

openspec/changes/cleanup-docker-images/design.md

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
当前仓库已有多个 devops PowerShell 脚本,并已形成 `SupportsShouldProcess``DryRun`、严格错误处理与统一入口调用的脚本约定。Docker 镜像在本地开发过程中会持续增长,手工执行 `docker image prune` 虽然可行,但缺少可追溯策略、保留规则和一致输出,容易造成误删或清理不足。
44

5-
目标变更需要在不引入额外第三方依赖的前提下,复用本地 Docker CLI 提供一个“默认安全、可预览、可配置”的清理入口
5+
目标变更需要在现有 Docker CLI 基础上,增加 `fzf` 交互式多选能力,用于从候选镜像中选择实际删除项,并在 `fzf` 缺失时给出明确安装提示并快速失败
66

77
## Goals / Non-Goals
88

@@ -11,11 +11,14 @@
1111
- 默认采用安全策略,只删除明确可清理对象,并提供 `DryRun` 预览。
1212
- 提供保留规则(仓库名、tag)以降低误删风险。
1313
- 输出清理前后空间统计,便于验证收益。
14+
- 增加 `fzf` 多选交互,支持在候选镜像中交互选择删除目标。
15+
-`fzf` 不可用时,快速失败并提示安装。
1416

1517
**Non-Goals:**
1618
- 不管理容器、volume、network 的全面生命周期,仅聚焦镜像清理。
1719
- 不实现 daemon 或长期驻留任务调度。
1820
- 不替代 Docker 原生命令的全部参数,只覆盖项目常用场景。
21+
- 不提供非 `fzf` 的交互回退方案(如数字菜单、Out-GridView)。
1922

2023
## Decisions
2124

@@ -31,28 +34,38 @@
3134
- 备选:固定内置白名单。
3235
- 选择理由:不同开发机镜像依赖差异大,参数化更灵活且可审计。
3336

34-
4. 决策:所有删除动作统一走 `ShouldProcess` 语义,并支持 `DryRun`
37+
4. 决策:交互选择统一使用 `fzf` 多选,不提供回退交互实现。
38+
- 备选:自动回退到基础文本菜单。
39+
- 选择理由:保持交互体验一致并降低多套交互代码维护成本。
40+
41+
5. 决策:当 `fzf` 不可用时立即失败,并输出安装指引。
42+
- 备选:静默跳过交互并继续按全量候选删除。
43+
- 选择理由:避免用户在未知状态下误删镜像,失败显式优于隐式降级。
44+
45+
6. 决策:所有删除动作统一走 `ShouldProcess` 语义,并支持 `DryRun`
3546
- 备选:只打印命令但不接入 `ShouldProcess`
3647
- 选择理由:与仓库现有脚本一致,便于用户认知和自动化调用。
3748

38-
5. 决策:清理结果通过 `docker system df` 前后对比呈现。
49+
7. 决策:清理结果通过 `docker system df` 前后对比呈现。
3950
- 备选:仅输出删除镜像数量。
4051
- 选择理由:磁盘释放量是核心目标,数量不足以反映收益。
4152

4253
## Risks / Trade-offs
4354

4455
- [Risk] Docker CLI 输出在不同版本存在字段差异,解析易脆弱。 → Mitigation:优先采用稳定参数与保守解析策略,解析失败时回退到原始输出。
45-
- [Risk] 误删频繁使用但暂时未运行容器引用的镜像。 → Mitigation:默认保守模式 + 保留规则 + `DryRun` 预览。
56+
- [Risk] `fzf` 在部分环境未安装,导致交互流程不可用。 → Mitigation:启动前显式检测并输出可复制的安装命令提示。
57+
- [Risk] 误删频繁使用但暂时未运行容器引用的镜像。 → Mitigation:默认保守模式 + 保留规则 + `DryRun` 预览 + 交互多选确认。
4658
- [Risk] 激进模式可能影响后续构建速度(需重新拉取镜像)。 → Mitigation:将激进模式设置为显式开关,并在输出中明确提示。
4759

4860
## Migration Plan
4961

50-
1. 新增清理脚本并补充帮助注释与示例。
51-
2. 在本地以 `DryRun` 验证候选列表与输出格式。
52-
3. 在有 Docker 环境的机器执行实清理,记录前后磁盘占用对比。
53-
4. 如发现保留策略不足,调整默认参数与文档示例。
62+
1. 更新脚本参数与顶部帮助文档,增加 `fzf` 交互与依赖说明。
63+
2. 实现 `fzf` 多选流程,并在缺失 `fzf` 时快速失败输出安装提示。
64+
3. 在本地以 `DryRun``WhatIf` 验证候选筛选、交互选择与输出格式。
65+
4. 在有 Docker 环境的机器验证实删除路径并记录前后磁盘占用对比。
66+
5. 更新示例命令,覆盖默认模式、交互模式和激进模式。
5467

5568
## Open Questions
5669

57-
- 默认“长期未使用”的阈值是以小时还是天暴露参数更符合现有用户习惯
58-
- 是否需要将 build cache 清理作为独立开关纳入首版
70+
- 是否需要在无 TTY 场景(例如 CI)中显式禁止交互模式并返回专门错误码
71+
- 安装提示是否需要按 Linux/macOS/Windows 分别提供推荐命令

openspec/changes/cleanup-docker-images/proposal.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@
77
- 新增一个 `scripts/pwsh/devops/` 下的 Docker 镜像清理脚本,用于识别并删除可清理镜像。
88
- 提供默认安全清理策略(优先清理 dangling 与长期未使用镜像),并支持显式激进模式。
99
- 提供保留规则参数(按仓库名、tag 等)避免误删关键基础镜像。
10+
- 增加 `fzf` 交互式多选流程,用于从候选镜像中选择实际删除项。
11+
- 当本机未安装 `fzf` 时,脚本快速失败并输出明确安装提示,不回退到其他交互方案。
1012
- 提供 `DryRun` 预览与清理前后空间统计输出,确保操作可验证。
1113
- 与现有 `scripts/pwsh/devops/run.ps1` 入口兼容,可通过统一入口调用。
1214

1315
## Capabilities
1416

1517
### New Capabilities
16-
- `docker-image-cleanup`: 提供可配置、可预览的 Docker 冗余镜像清理能力,包含安全默认策略、保留规则与空间统计
18+
- `docker-image-cleanup`: 提供可配置、可预览的 Docker 冗余镜像清理能力,包含安全默认策略、保留规则、`fzf` 多选交互与空间统计
1719

1820
### Modified Capabilities
1921
-
2022

2123
## Impact
2224

2325
- 受影响代码:`scripts/pwsh/devops/` 新增清理脚本;可能补充脚本文档注释与调用示例。
24-
- 依赖系统:本地 Docker CLI(`docker`)可用。
26+
- 依赖系统:本地 Docker CLI(`docker``fzf` 可用。
2527
- 行为影响:执行清理会删除满足条件的本地镜像,需要通过默认安全策略与参数保护降低误删风险。

openspec/changes/cleanup-docker-images/specs/docker-image-cleanup/spec.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@
77
- **WHEN** 用户不传入激进模式参数运行清理脚本
88
- **THEN** 脚本仅选择低风险候选镜像并跳过受保护镜像
99

10+
### Requirement: Fzf multi-select interaction
11+
系统 SHALL 提供基于 `fzf` 的多选交互流程,让用户从候选镜像中选择实际删除项。
12+
13+
#### Scenario: 用户通过 fzf 选择删除目标
14+
- **WHEN** 用户启用交互式多选模式运行清理脚本
15+
- **THEN** 脚本通过 `fzf` 展示候选镜像并仅对用户选中的条目执行删除
16+
17+
### Requirement: Fzf dependency enforcement
18+
系统 SHALL 在进入交互式多选流程前检测 `fzf` 可用性;若未安装,MUST 立即失败并输出明确安装提示。
19+
20+
#### Scenario: 缺失 fzf 时快速失败并提示安装
21+
- **WHEN** 用户启用交互式多选模式且运行环境不存在 `fzf`
22+
- **THEN** 脚本以非零退出并输出可执行的 `fzf` 安装提示
23+
1024
### Requirement: Dry-run preview before deletion
1125
系统 SHALL 支持 `DryRun` 预览模式,并在该模式下仅展示候选镜像、预计释放空间与将执行命令,MUST NOT 实际删除任何镜像。
1226

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
## 1. Script Skeleton
22

3-
- [ ] 1.1 新增 `scripts/pwsh/devops/Clean-DockerImages.ps1` 并建立标准头部注释、`CmdletBinding(SupportsShouldProcess)``Set-StrictMode` 与统一错误处理。
4-
- [ ] 1.2 定义并校验核心参数(如 `DryRun`、激进模式开关、时间阈值、保留规则参数),补充默认值与参数说明。
3+
- [x] 1.1 新增 `scripts/pwsh/devops/Clean-DockerImages.ps1` 并建立标准头部注释、`CmdletBinding(SupportsShouldProcess)``Set-StrictMode` 与统一错误处理。
4+
- [x] 1.2 定义并校验核心参数(如 `DryRun`、激进模式开关、时间阈值、保留规则参数),补充默认值与参数说明。
55

66
## 2. Cleanup Logic
77

8-
- [ ] 2.1 实现 Docker CLI 可用性检查与失败快返逻辑,确保环境不满足时返回非零退出码与清晰提示。
9-
- [ ] 2.2 实现默认保守清理候选筛选(含 dangling 与时间阈值过滤),并在删除前应用保留规则过滤。
10-
- [ ] 2.3 实现显式激进模式分支,确保仅在用户开启参数时执行更高强度清理,并输出风险提示。
8+
- [x] 2.1 实现 Docker CLI 可用性检查与失败快返逻辑,确保环境不满足时返回非零退出码与清晰提示。
9+
- [x] 2.2 实现默认保守清理候选筛选(含 dangling 与时间阈值过滤),并在删除前应用保留规则过滤。
10+
- [x] 2.3 实现显式激进模式分支,确保仅在用户开启参数时执行更高强度清理,并输出风险提示。
1111

1212
## 3. Safety And Reporting
1313

14-
- [ ] 3.1 实现 `DryRun` 预览输出,展示候选镜像、预计操作和命令,不执行实际删除。
15-
- [ ] 3.2 实现清理前后 `docker system df` 统计采集与差异输出,展示镜像占用变化。
16-
- [ ] 3.3 删除操作统一接入 `ShouldProcess` 语义,确保交互式与自动化调用行为一致。
14+
- [x] 3.1 实现 `DryRun` 预览输出,展示候选镜像、预计操作和命令,不执行实际删除。
15+
- [x] 3.2 实现清理前后 `docker system df` 统计采集与差异输出,展示镜像占用变化。
16+
- [x] 3.3 删除操作统一接入 `ShouldProcess` 语义,确保交互式与自动化调用行为一致。
1717

1818
## 4. Validation
1919

20-
- [ ] 4.1 在有 Docker 环境下分别验证默认模式、`DryRun`、激进模式、保留规则命中场景。
21-
- [ ] 4.2 通过 `scripts/pwsh/devops/run.ps1` 入口验证脚本可被发现并正常传参调用。
22-
- [ ] 4.3 执行根目录 `pnpm qa` 并修复出现的问题,确保本次改动满足仓库质量门槛。
20+
- [x] 4.1 在有 Docker 环境下分别验证默认模式、`DryRun`、激进模式、保留规则命中场景。
21+
- [x] 4.2 通过 `scripts/pwsh/devops/run.ps1` 入口验证脚本可被发现并正常传参调用。
22+
- [x] 4.3 执行根目录 `pnpm qa` 并修复出现的问题,确保本次改动满足仓库质量门槛。
23+
24+
## 5. Fzf Interactive Mode
25+
26+
- [x] 5.1 增加交互式多选参数与 `fzf` 调用流程,仅删除用户在 `fzf` 中选中的候选镜像。
27+
- [x] 5.2 增加 `fzf` 依赖检测,缺失时快速失败并输出明确安装提示。
28+
- [x] 5.3 更新 `scripts/pwsh/devops/Clean-DockerImages.ps1` 顶部帮助文档,补充 `fzf` 交互模式说明与示例。
29+
- [x] 5.4 在 Docker 环境验证 `fzf` 多选路径、缺失 `fzf` 报错路径,并执行根目录 `pnpm qa`

0 commit comments

Comments
 (0)