ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Jenkins构建机磁盘爆盘防护:docker-cleanup在CI/CD场景的实战用法

Jenkins构建机磁盘爆盘防护:docker-cleanup在CI/CD场景的实战用法 Jenkins构建机磁盘爆盘防护docker-cleanup在CI/CD场景的实战用法【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanupdocker-cleanup 是一款轻量的 Docker 清理镜像能定时自动清理退出的容器、无用镜像和悬空卷是 Jenkins 构建机磁盘爆盘防护的常用方案。本文带你快速上手部署并讲清楚配置中的关键细节与踩坑点。一、为什么 Jenkins 构建机总是磁盘爆盘构建机上的 Docker 资源“只增不减”三个元凶退出容器持续占盘每次构建结束容器进入 exited 状态不手动docker rm -v就永远留在磁盘上旧镜像版本堆积SNAPSHOT 镜像被反复重建留下大量无标签的none镜像悬空卷dangling volume累积容器删除时没带-v数据卷照样占用空间三样东西几个月就能吃满一块磁盘而磁盘一爆所有流水线立刻瘫痪。docker-cleanup 的解决思路很直接定时循环 自动清理 白名单可控。二、工作原理一个循环三件事镜像的核心逻辑在run.sh主脚本中每轮循环依次做三件事清理悬空卷新版本 Docker 直接调用原生docker volume rm旧版本则执行docker-cleanup-volumes.sh脚本扫描 Docker 数据目录中的无用卷删除退出/死亡容器逐一比对KEEP_CONTAINERS按镜像名和KEEP_CONTAINERS_NAMED按容器名白名单不匹配的才删除删除无用镜像用“全量镜像列表”减去“被任意容器引用的镜像”再排除KEEP_IMAGES白名单最后执行docker rmi顺带清掉“已创建但一直启动不了”的卡死容器默认每CLEAN_PERIOD30 分钟跑一轮且删除前有DELAY_TIME30 分钟的缓冲期避免误伤正在使用的资源。ℹ️提示该仓库已标注 DEPRECATED见README.md开头处于停止维护状态建议作为参考实现学习新体系下也可用docker system prune配合 cron 实现类似效果。三、最快上手三种部署方式1. 命令行一行启动先跑通docker run -d \ --name docker-cleanup \ -v /var/run/docker.sock:/var/run/docker.sock:rw \ -v /var/lib/docker:/var/lib/docker:rw \ meltwater/docker-cleanup:latest原理很简单把宿主机的 Docker socket 挂载进容器清理容器通过 socket 操作宿主机 Docker几乎零资源开销。2. systemd 托管构建机长期运行在构建机创建/etc/systemd/system/docker-cleanup.service完整的 unit 文件示例可参考README.md中的Systemd章节要点Afterdocker.serviceRequiresdocker.service保证在 Docker 之后启动Restartalways异常自动拉起同时挂载 socket 和/var/lib/docker后者才能启用卷清理然后执行systemctl enable --now docker-cleanup即可开机自启。3. K8s DaemonSet集群节点一键全覆盖项目自带contrib/k8s-daemonset.yml一条命令即可让集群每个节点都跑一个清理容器kubectl create -f contrib/k8s-daemonset.yml⚠️ 示例配置中CLEAN_PERIOD60检查频率较高如果你的节点构建频率大建议改回 1800 更稳妥。四、关键环境变量配置速查表 ⚙️通过docker run -e传参或用统一的 env 文件管理项目自带示例文件env.list变量默认值作用Jenkins 场景建议CLEAN_PERIOD1800每轮清理间隔秒构建频繁可缩短到 600~1800DELAY_TIME1800实际删除前的缓冲等待秒不宜短于最长构建时长KEEP_IMAGES空即清理所有无用镜像镜像白名单逗号分隔加入构建基础镜像如jenkins/jenkins,mavenKEEP_CONTAINERS空退出容器的镜像白名单同上KEEP_CONTAINERS_NAMED空退出容器的名称白名单挂载持久数据的容器LOOPtrue设为false则执行一次即退出搭配 cron 做定点清理DEBUG0设为1输出白名单匹配日志排查“为什么被删/没被删”DOCKER_API_VERSION1.20Docker API 版本与宿主机保持一致项目env.list中的示例取值供参考CLEAN_PERIOD1800 DELAY_TIME30 LOOPtrue五、白名单匹配规则最容易踩坑的地方 ⚠️KEEP_IMAGES等变量是bash 左前缀匹配不是正则。也就是说镜像foo/bar:tag会被以下任意一项命中foo/bar:tag、foo/bar、foo/b*/*:tag、*:tag、foo/*:tag但不会被foo/baz、bar:tag、:tag命中。三个常见误区想保留所有镜像却写了*—— 会被当作文件名匹配而失效正确写法是*:tag想关闭镜像清理—— 设KEEP_IMAGES*:tag匹配全部即可莫名删了/没删—— 设DEBUG1日志会打印每个镜像、容器的匹配判断过程六、CI/CD 实战最佳实践 ✅先试跑再挂载数据目录挂载/var/lib/docker后才会清理卷风险也最大README.md的 WARNING 明确提示极端情况可能删卷。建议先用LOOPfalse在低峰期跑一次确认日志符合预期用KEEP_IMAGES保护基础镜像构建工具镜像加入白名单避免每次清理后下一轮构建白等 pull 时间DELAY_TIME设得比最长任务长防止误清正在拉取中的镜像或刚退出的容器脚本删除前还会二次核对“被容器引用的镜像”这是run.sh中的保护逻辑结合 cron 精准定时LOOPfalse crontab例如每天凌晨 3 点全量清理一次比常驻循环更可预期集群部署用contrib/k8s-daemonset.yml的 DaemonSet让每个 Jenkins agent 节点都拥有独立的磁盘防护七、常见问题 FAQ ❓Q怎么确认空间真的被释放了A看容器日志中的 Done! X images and Y layers have been cleaned再在宿主机执行docker system df对比前后。Q会不会影响正在跑的构建A理论上不会。删除只针对已退出容器、以及未被任何容器引用的镜像且脚本在删除前会二次核对容器引用关系。不过首次上线仍建议先配置白名单。Q和docker system prune相比优势在哪Aprune只能手动或 cron 触发参数粒度粗docker-cleanup 的优势是白名单粒度更细 延迟缓冲 常驻循环更适合构建机的长期防护场景。【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanup创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表