当前位置: 首页 > news >正文

理解与清理 Docker 中的悬空镜像(Dangling Images)

目录

  • 理解与清理 Docker 中的悬空镜像(Dangling Images)
    • 1. 什么是悬空镜像(Dangling Images)?
      • Example:查看悬空镜像
    • 2. 悬空镜像是如何产生的?
      • (1) 构建新镜像时覆盖旧标签
      • (2) 删除镜像后遗留的中间层
      • (3) 使用 docker pull 更新镜像
    • 3. 如何清理悬空镜像?
      • (1) 基本清理(仅删除悬空镜像)
      • (2) 强制清理(无需确认)
      • (3) 清理所有未被使用的镜像(不仅仅是悬空镜像)
      • (4) 结合过滤条件清理
    • 4. 如何避免悬空镜像积累?
      • (1) 使用 --force-rm 避免构建残留
      • (2) 使用多阶段构建(Docker 17.05+)
      • (3) 定期执行自动清理
    • 5. 总结

理解与清理 Docker 中的悬空镜像(Dangling Images)

1. 什么是悬空镜像(Dangling Images)?

悬空镜像是指 没有标签(Tag)未被任何容器引用 的 Docker 镜像层。它们通常是构建或删除镜像时遗留下来的中间层,不再被使用但仍然占据存储空间。

在这里插入图片描述

Example:查看悬空镜像

docker images -f "dangling=true"

输出可能类似:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
<none>      <none>    123456789abc   2 hours ago    350MB

可以看到,这些镜像没有 REPOSITORYTAG,仅有一个 IMAGE ID,这就是典型的悬空镜像。


2. 悬空镜像是如何产生的?

(1) 构建新镜像时覆盖旧标签

docker build -t my-app:1.0 .
# 再次构建同一个标签
docker build -t my-app:1.0 .

第二次构建后,旧的 my-app:1.0 镜像会变成 <none>:<none>,成为悬空镜像。

(2) 删除镜像后遗留的中间层

docker rmi my-app:1.0

如果该镜像有未被引用的依赖层,它们可能会变成悬空镜像。

(3) 使用 docker pull 更新镜像

docker pull nginx:latest
# 当新版本推送后,再次拉取
docker pull nginx:latest

旧版本的 nginx:latest 会变成 <none>:<none>,成为悬空镜像。


3. 如何清理悬空镜像?

Docker 提供了 docker image prune 命令专门用于清理悬空镜像。

(1) 基本清理(仅删除悬空镜像)

docker image prune

默认会提示确认,输入 y 后删除。

(2) 强制清理(无需确认)

docker image prune -f

(3) 清理所有未被使用的镜像(不仅仅是悬空镜像)

docker image prune -a

⚠️ 注意:这会删除所有未被容器引用的镜像,包括可能有用的缓存镜像,使用需谨慎!

(4) 结合过滤条件清理

# 删除超过 24 小时的悬空镜像
docker image prune --filter "until=24h"

4. 如何避免悬空镜像积累?

(1) 使用 --force-rm 避免构建残留

docker build --force-rm -t my-app:1.0 .

这样可以在构建失败时自动清理中间层。

(2) 使用多阶段构建(Docker 17.05+)

# 第一阶段:构建环境
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .# 第二阶段:仅保留可执行文件
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/myapp # 这里的 /app/myapp 来源于上面的构建
CMD ["myapp"]

这样能减少不必要的镜像层,降低悬空镜像的产生。

(3) 定期执行自动清理

可以在 CI/CD 流程或 cron 任务中加入自动清理:

docker image prune -f

或者结合 system prune 清理整个 Docker 系统:

docker system prune -f

5. 总结

关键点说明
悬空镜像是什么?无标签且未被引用的镜像层
如何查看?docker images -f "dangling=true"
如何清理?docker image prune(基础)、docker image prune -a(彻底)
如何避免?使用 --force-rm、多阶段构建、定期清理

悬空镜像虽然不会影响运行中的容器,但会占用磁盘空间。定期清理可以提高 Docker 环境的效率,特别是在频繁构建和更新的场景下。

拓展:

  • Docker 官方文档:docker image prune
  • Docker 多阶段构建最佳实践

相关文章:

  • 大语言模型中的“温度”参数到底是什么?如何正确设置?
  • 终端安全登录系统的必要性及安当SLA双因素认证解决方案深度解析
  • MySQL基础关键_010_数据库设计三范式
  • 7.2.安全防御
  • Java版ERP管理系统源码(springboot+VUE+Uniapp)
  • Android学习总结之MMKV(代替SharedPreferences)
  • 远程访问代理+内网穿透:火山引擎边缘网关助力自部署模型公网调用与全链路管控
  • 【Leetcode 每日一题 - 扩展】3342. 到达最后一个房间的最少时间 II
  • Kubernetes集群生产环境智能伸缩指南
  • 数据分析案例(2)
  • [量化交易Backtrader] - 如何规避过拟合
  • 无网络环境下配置并运行 word2vec复现.py
  • 大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners​
  • 南京市出台工作方案深化“智改数转网联”,物联网集成商从“困局”到“蓝海”!
  • Vue 项目中长按保存图片功能实现指南
  • Unity_JK框架【4】MonoSystem 和 协程工具类 的剖析与实践
  • Czkawka:跨平台重复文件清理
  • 滑动窗口——无重复字符最长的字串
  • 蓝桥杯国赛备赛——字符串
  • Redis持久化存储介质评估:NFS与Ceph的适用性分析
  • 巴基斯坦空袭印度多地空军基地,巴战机进入印领空
  • 习近平同瑞典国王卡尔十六世·古斯塔夫就中瑞建交75周年互致贺电
  • 中华人民共和国和俄罗斯联邦在纪念中国人民抗日战争、苏联伟大卫国战争胜利和联合国成立80周年之际关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 身临其境感受伟人思想力量,“马克思书房”在上海社科馆揭幕
  • 潘功胜:降准0.5个百分点,降低政策利率0.1个百分点
  • 山东滕州一车辆撞向公交站台撞倒多人,肇事者被控制,案件已移交刑警