docker-cleanup源码解析:run.sh如何安全清理已退出容器与无用镜像

发布时间:2026/10/23 19:09:18

docker-cleanup源码解析:run.sh如何安全清理已退出容器与无用镜像 docker-cleanup源码解析run.sh如何安全清理已退出容器与无用镜像【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanupDocker 清理工具 docker-cleanup 是一个自动化的 Docker 维护脚本它会周期性删除已退出容器、无用镜像和孤儿数据卷防止磁盘被越撑越大。本文带你读懂它的核心脚本 run.sh看它是如何在删得干净和删得安全之间取得平衡的。为什么需要 Docker 容器与镜像自动清理平时我们docker run一个容器退出后它并不会消失而是以exited状态留在磁盘上构建镜像时不断覆盖旧版本又会留下大量none无标签镜像。CI 构建机、Jenkins 构建节点容器频繁启停几天就能堆满磁盘K8s / 集群节点Pod 调度换来换去旧镜像版本越积越多开发机数据卷、created卡住的容器悄悄占用空间手动执行docker system prune费时费力docker-cleanup 就是把这件事变成周期性自动执行并且通过白名单机制让你放心地让它跑在后台。⚠️ 小提醒该项目已标记为 DEPRECATED不再活跃维护但脚本逻辑简单透明非常适合学习 Docker 运维脚本的写法也仍可自托管使用。项目结构一览 项目非常精简核心就两个脚本 一份构建配置run.sh—主清理脚本负责清理容器、镜像、数据卷本文主角docker-cleanup-volumes.sh— 清理孤儿数据卷的辅助脚本支持--dry-run预演模式Dockerfile— 基于 alpine 镜像打包内置 docker 客户端入口即run.shMakefile— 开发用快捷命令build / run / restart 等contrib/k8s-daemonset.yml— Kubernetes DaemonSet 部署清单让每个节点都自动清理env.list— 环境变量示例CLEAN_PERIOD、DELAY_TIME、LOOPrun.sh 工作流程全解析 整个脚本可以概括为检查环境 → 清数据卷 → 清容器 → 算镜像差集 → 缓冲等待 → 再确认 → 删镜像这样一个循环。下面按源码顺序拆解每一步。1️⃣ 启动前的两道安全检查脚本开头run.sh第 18~29 行附近先确认两件事/var/run/docker.sock是否存在 —— 没有 Docker Socket 就没法操作主机上的 Dockerdocker version能否正常执行 —— 验证 docker 客户端挂载是否正确任何一项不满足就直接报错退出。这是安全的第一层宁可不动手也不带病运行。2️⃣ 环境变量与默认值Dockerfile中所有配置项默认值都是**None**脚本启动时会把它们翻译成真实默认值环境变量默认值作用CLEAN_PERIOD1800 秒每轮清理结束后的间隔时间DELAY_TIME1800 秒清理前等待缓冲的时间KEEP_IMAGES空镜像白名单前缀通配逗号分隔KEEP_CONTAINERS空按镜像名保留容器KEEP_CONTAINERS_NAMED空按容器名保留容器LOOPtrue是否循环运行设false只跑一次DEBUG0设为 1 输出白名单匹配详情白名单用的是shell 前缀通配而不是正则写foo/bar就能匹配foo/bar:tag、foo/bar:latest等所有标签非常省心。3️⃣ 清理已退出/死亡容器核心逻辑脚本用docker ps -a -q -f statusexited -f statusdead捞出所有已退出和死亡容器的 ID然后对每一个容器做白名单检查取出该容器的镜像名和容器名分别用checkPatterns函数与KEEP_CONTAINERS、KEEP_CONTAINERS_NAMED做前缀匹配只要命中任一白名单 → 跳过都没命中 → 执行docker rm -v连容器带匿名卷一起删除这里的checkPatterns函数run.sh开头定义就是整个安全删除的关键先匹配、再动手逐个决策绝不批量盲删。4️⃣ 用差集安全删除无用镜像 ️这是全脚本最精巧的部分思路是经典的集合差集列出所有镜像 ID存成ImageIdList遍历所有容器包括已退出的用docker inspect提取每个容器实际使用的镜像 ID存成ContainerImageIdList用comm -23求差集 → 得到不被任何容器引用的镜像即待删列表若设置了KEEP_IMAGES再和白名单镜像 ID求一次差集把受保护的镜像剔除安全点在于判断依据是有没有容器在用而不是镜像名字好不好看所以正在使用的镜像无论如何都不会被误删。5️⃣ DELAY_TIME 缓冲 二次确认算出待删镜像后脚本不会立刻删而是先sleep ${DELAY_TIME}默认 30 分钟。等待期间会处理另一类卡住的容器那些状态停留在created创建了但一直没启动成功且持续未启动的容器会被清理掉。缓冲结束后脚本会重新拉取一遍容器正在使用的镜像 ID与待删列表再做一次comm过滤然后才执行docker rmi。为什么要做两次因为等待窗口内可能有新容器拉起了镜像比如刚拉完镜像还没启动。二次确认能防止算差集时没人用、删除时正要用的竞态误删。6️⃣ 数据卷清理的版本自适应 数据卷清理策略会因 Docker 版本不同而自动切换新版 Docker直接使用原生命令只删除danglingtrue未被引用的卷老版 Docker1.x/早期 2.x调用辅助脚本docker-cleanup-volumes.sh它通过解析/var/lib/docker/volumes目录、比对所有容器挂载的卷 ID来找出真正无主的孤儿卷辅助脚本还支持--dry-run只显示会删什么不真删和--verbose在陌生环境里先预演一遍是好习惯。7️⃣ 优雅退出与循环脚本注册了SIGINT/SIGTERM的 trap收到信号会打印提示并干净退出不会留下半成品状态每轮结束后sleep ${CLEAN_PERIOD}然后进入下一轮LOOPfalse时跑完一轮即退出适合配合 crontab 使用它安全在哪里总结 4 道防线 ✅启动自检Socket 和 docker 客户端任一异常就拒绝运行白名单机制镜像名、容器名双维度保护前缀通配好写好用差集判定 二次确认只删确实无容器引用的镜像且删除前再核对一次时间缓冲DELAY_TIME 给正在拉取/启动的容器留出窗口避免竞态误删快速上手3 种部署方式 方式一命令行直接跑docker run \ -v /var/run/docker.sock:/var/run/docker.sock:rw \ -v /var/lib/docker:/var/lib/docker:rw \ meltwater/docker-cleanup:latest方式二Makefile 快捷命令仓库自带Makefile执行make run即可按env.list中的配置启动清理容器。方式三Kubernetes DaemonSet仓库提供了contrib/k8s-daemonset.yml执行kubectl create -f contrib/k8s-daemonset.yml就能让集群每个节点都跑一个清理实例天然适配集群场景。建议先用DEBUG1LOOPfalse跑一轮观察日志里的匹配明细确认白名单行为符合预期后再放开循环运行。注意事项 ⚠️挂载/var/lib/docker后脚本会直接操作宿主机存储官方 README 明确警告在不兼容的 Docker 版本上极端情况可能删除运行中容器的数据卷生产环境请谨慎KEEP_CONTAINERS/KEEP_CONTAINERS_NAMED设成**All**表示全部保留内部会转换成通配符.想保留全部镜像请用*:*不要用裸*会被当成文件名匹配项目已停止维护若用于生产建议结合官方推荐的docker system prune Docker 内置 image GC 策略做对照验证总结 docker-cleanup 的 run.sh 虽然只有 200 多行 bash却示范了一套教科书级的安全自动化清理套路启动自检、白名单、差集判定、时间缓冲、二次确认、优雅退出。理解这套设计后无论是自托管使用还是参考它编写自己的容器运维脚本都能少走很多弯路。对于容器频繁启停的构建机和集群节点这类自动清理工具是守住磁盘空间的第一道防线。【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanup创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/21 8:55:10

MeteoInfo 实战指南:从拉取源码到输出气象分析图的3个步骤

MeteoInfo 实战指南:从拉取源码到输出气象分析图的3个步骤 【免费下载链接】MeteoInfo MeteoInfo: GIS, scientific computation and visualization environment. 项目地址: https://gitcode.com/gh_mirrors/me/MeteoInfo 拿到 NetCDF 或 GRIB 文件,十分钟要出一张分析图…

2026/10/21 3:20:22

智能体发展历程

智能体概念的起源可追溯到20世纪70年代。当时,人工智能领域正处于蓬勃发展阶段,研究者们开始尝试构建能够模拟人类智能行为的系统。早期的智能体模型相对简单,主要侧重于解决特定领域的问题,例如在专家系统中,智能体利…

2026/10/23 20:11:40

WPF原生控件仿Word富文本编辑器:FlowDocument与命令绑定

简介:面向希望基于 WPF 构建类 Word 文本编辑环境的 .NET 开发者,这套开源富文本编辑器示例提供可直接运行的解决方案与可复用核心组件,覆盖基础文本编辑、查找替换、HTML 源码查看、打印、纯文本导出、插入图片和表格等常见能力。压缩包共 2…

2026/10/23 20:11:40

C++引用详解:从底层原理到与指针的硬核对比

C里有一个特别有意思的现象:很多人学指针时觉得“不过如此”,但一遇到引用就开始犯迷糊。引用这个概念,表面上看就是“给变量起了个别名”,可一旦牵涉到函数参数、返回值、重载决议,甚至和指针放在一起对比&#xff0c…

2026/10/23 20:11:40

Java网页表格抓取实战:HttpClient+Jsoup导出CSV

简介:这份资料面向Java初学者和需要采集网页数据的开发者,演示在MyEclipse环境下抓取网页表格并整理为结构化数据的完整思路,涉及HttpClient、Jsoup等常用库的组合使用,适合作为数据挖掘前的数据获取练习或课程设计参考。压缩包共…

2026/10/23 20:01:39

xlsx课表转ics日历:Python脚本自动处理单双周与调休

简介:这份资源面向需要将Excel课表批量导入日历的学生与教育工作者,解决手动逐条录入课程、跨平台日程难以同步的问题。包内共4个文件,包含可执行程序、课表样例、JSON配置与说明文档,压缩包约9.8MB,其中exe负责核心转…

2026/10/23 20:01:39

Fork/Join并发框架:分治算法与工作窃取实战解析

1. 先搞清楚Fork/Join到底在解决什么问题1.1 分治思想:从“一个人干不完”说起Fork/Join这个名字,我最早在Java 7的并发工具包里见到时,第一反应是“名字起得真直白”——Fork就是分叉,Join就是合并。说白了,它就是两大…

2026/10/23 20:01:39

离散数学第二章关系全解析:从集合到等价与偏序

1. 离散数学第二章到底在讲什么1.1 从“集合”到“关系”:这一章的核心脉络离散数学第二章,绝大多数教材安排的都是关系。但很多人翻开书第一眼看到的却是“二元关系”“笛卡尔积”“自反闭包”这些词,直接就被劝退了。我当初学这一章的时候也…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑