镜像删不掉的原因
删除镜像时报被使用或存在依赖的子镜像:要先处理引用它的容器(含已停止的),再删镜像。强制删除只是解除引用,不会回收底层数据。
基本信息
| 定位 | 按祖先镜像过滤容器列表 |
|---|---|
| 顺序 | 停止并删除容器,再删镜像,最后清理悬空层 |
| 机制 | 层被容器引用时不可回收 |
| 强制删除 | 只摘标签,不回收底层数据 |
| 多标签 | 同一镜像的多个标签需分别处理 |
典型使用场景
- 清理旧版本镜像时被引用阻塞
- 排查磁盘占用高但镜像列表看起来不多
- 批量清理前的依赖梳理
- 确认某镜像是否仍被运行中的业务使用
- 处理多标签指向同一镜像的情况
按顺序清理
按顺序清理
docker ps -a --filter ancestor=app/web:1.0 --format '{{.ID}} {{.Status}}'
docker rm $(docker ps -aq --filter ancestor=app/web:1.0) 2>/dev/null # 先删容器
docker rmi app/web:1.0 # 再删镜像
docker image prune -f # 清理悬空层关注点与注意事项
| 关注点 | 做法 | 注意 |
|---|---|---|
| 引用关系 | 按祖先镜像过滤 | 含已停止的容器 |
| 删除顺序 | 先容器后镜像 | 顺序反了删不掉 |
| 强制删除 | 只摘标签 | 底层数据仍占用 |
| 多标签 | 逐个标签处理 | 删一个标签镜像仍在 |
批量删容器前先确认它们不是运行中的业务,用过滤条件限定祖先镜像缩小范围。
强制删除只把标签摘掉,空间还被悬空层占着,配合清理命令才完整。
多标签指向同一镜像时删掉一个标签镜像仍在,排查要看镜像的引用关系。
磁盘占用与镜像列表数量不成正比时,多半是悬空层在占空间。
已停止的容器同样占用引用,清理时要连它们一起处理。
清理前把目标容器与镜像清单导出留档,便于回溯误删情况。
确认镜像是否还被其他标签引用时,把镜像详情与标签列表交叉核对,避免清理掉仍在使用的版本。