|
2 | 2 |
|
3 | 3 | 当前仓库已有多个 devops PowerShell 脚本,并已形成 `SupportsShouldProcess`、`DryRun`、严格错误处理与统一入口调用的脚本约定。Docker 镜像在本地开发过程中会持续增长,手工执行 `docker image prune` 虽然可行,但缺少可追溯策略、保留规则和一致输出,容易造成误删或清理不足。 |
4 | 4 |
|
5 | | -目标变更需要在不引入额外第三方依赖的前提下,复用本地 Docker CLI 提供一个“默认安全、可预览、可配置”的清理入口。 |
| 5 | +目标变更需要在现有 Docker CLI 基础上,增加 `fzf` 交互式多选能力,用于从候选镜像中选择实际删除项,并在 `fzf` 缺失时给出明确安装提示并快速失败。 |
6 | 6 |
|
7 | 7 | ## Goals / Non-Goals |
8 | 8 |
|
|
11 | 11 | - 默认采用安全策略,只删除明确可清理对象,并提供 `DryRun` 预览。 |
12 | 12 | - 提供保留规则(仓库名、tag)以降低误删风险。 |
13 | 13 | - 输出清理前后空间统计,便于验证收益。 |
| 14 | +- 增加 `fzf` 多选交互,支持在候选镜像中交互选择删除目标。 |
| 15 | +- 当 `fzf` 不可用时,快速失败并提示安装。 |
14 | 16 |
|
15 | 17 | **Non-Goals:** |
16 | 18 | - 不管理容器、volume、network 的全面生命周期,仅聚焦镜像清理。 |
17 | 19 | - 不实现 daemon 或长期驻留任务调度。 |
18 | 20 | - 不替代 Docker 原生命令的全部参数,只覆盖项目常用场景。 |
| 21 | +- 不提供非 `fzf` 的交互回退方案(如数字菜单、Out-GridView)。 |
19 | 22 |
|
20 | 23 | ## Decisions |
21 | 24 |
|
|
31 | 34 | - 备选:固定内置白名单。 |
32 | 35 | - 选择理由:不同开发机镜像依赖差异大,参数化更灵活且可审计。 |
33 | 36 |
|
34 | | -4. 决策:所有删除动作统一走 `ShouldProcess` 语义,并支持 `DryRun`。 |
| 37 | +4. 决策:交互选择统一使用 `fzf` 多选,不提供回退交互实现。 |
| 38 | + - 备选:自动回退到基础文本菜单。 |
| 39 | + - 选择理由:保持交互体验一致并降低多套交互代码维护成本。 |
| 40 | + |
| 41 | +5. 决策:当 `fzf` 不可用时立即失败,并输出安装指引。 |
| 42 | + - 备选:静默跳过交互并继续按全量候选删除。 |
| 43 | + - 选择理由:避免用户在未知状态下误删镜像,失败显式优于隐式降级。 |
| 44 | + |
| 45 | +6. 决策:所有删除动作统一走 `ShouldProcess` 语义,并支持 `DryRun`。 |
35 | 46 | - 备选:只打印命令但不接入 `ShouldProcess`。 |
36 | 47 | - 选择理由:与仓库现有脚本一致,便于用户认知和自动化调用。 |
37 | 48 |
|
38 | | -5. 决策:清理结果通过 `docker system df` 前后对比呈现。 |
| 49 | +7. 决策:清理结果通过 `docker system df` 前后对比呈现。 |
39 | 50 | - 备选:仅输出删除镜像数量。 |
40 | 51 | - 选择理由:磁盘释放量是核心目标,数量不足以反映收益。 |
41 | 52 |
|
42 | 53 | ## Risks / Trade-offs |
43 | 54 |
|
44 | 55 | - [Risk] Docker CLI 输出在不同版本存在字段差异,解析易脆弱。 → Mitigation:优先采用稳定参数与保守解析策略,解析失败时回退到原始输出。 |
45 | | -- [Risk] 误删频繁使用但暂时未运行容器引用的镜像。 → Mitigation:默认保守模式 + 保留规则 + `DryRun` 预览。 |
| 56 | +- [Risk] `fzf` 在部分环境未安装,导致交互流程不可用。 → Mitigation:启动前显式检测并输出可复制的安装命令提示。 |
| 57 | +- [Risk] 误删频繁使用但暂时未运行容器引用的镜像。 → Mitigation:默认保守模式 + 保留规则 + `DryRun` 预览 + 交互多选确认。 |
46 | 58 | - [Risk] 激进模式可能影响后续构建速度(需重新拉取镜像)。 → Mitigation:将激进模式设置为显式开关,并在输出中明确提示。 |
47 | 59 |
|
48 | 60 | ## Migration Plan |
49 | 61 |
|
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. 更新示例命令,覆盖默认模式、交互模式和激进模式。 |
54 | 67 |
|
55 | 68 | ## Open Questions |
56 | 69 |
|
57 | | -- 默认“长期未使用”的阈值是以小时还是天暴露参数更符合现有用户习惯。 |
58 | | -- 是否需要将 build cache 清理作为独立开关纳入首版。 |
| 70 | +- 是否需要在无 TTY 场景(例如 CI)中显式禁止交互模式并返回专门错误码。 |
| 71 | +- 安装提示是否需要按 Linux/macOS/Windows 分别提供推荐命令。 |
0 commit comments