当前位置: 首页 > 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 多阶段构建最佳实践
http://www.xdnf.cn/news/315883.html

相关文章:

  • 8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战
  • HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
  • 实践004-Gitlab CICD部署应用
  • 小刚说C语言刷题—1331 做彩纸花边
  • 五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
  • Spark和Hadoop之间的联系
  • JDK Version Manager (JVMS)
  • 【论文阅读】在调制分类中针对对抗性攻击的混合训练时和运行时防御
  • Web 架构之动静分离:原理、实践与优化
  • WHAT - Rust 智能指针
  • 【PostgreSQL】数据库主从库备份与高可用部署
  • 探索智能体开发新边界:Cangjie Magic开源平台体验与解析
  • maven基本介绍
  • Nginx+Lua+Redis实现灰度发布
  • spring4.x详解介绍
  • 一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
  • Go语言八股之channel详解
  • LeetCode 热题 100 64. 最小路径和
  • 明远智睿SD2351核心板:工业AIoT时代的创新引擎
  • 大数据、物联网(IoT)、平台架构与设计重构大模型应用
  • 轻松管理房间预约——启辰智慧预约小程序端使用教程
  • 软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
  • Linux中的`export` 设置的环境变量是临时的吗?如何永久生效?
  • 使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结
  • AI驱动的Kubernetes管理:kubectl-ai 如何简化你的云原生运维
  • 验证es启动成功
  • Nacos源码—5.Nacos配置中心实现分析一
  • Linux内核初始化机制全解析:从pure_initcall到late_initcall
  • ETL介绍
  • AI与Web3.0:去中心化智能合约的未来