跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

怎么在CI/CD构建机上实现Docker卷的自动化定时巡检与垃圾清理

Docker卷需主动清理以防止磁盘空间耗尽,应识别并删除未被引用、命名含临时标识或创建超7天的孤立卷,排除生产级持久化卷,通过分步巡检与分级清理脚本实现安全回收。 在CI/CD构建机上,Docker卷(volumes)容易被忽略,但长期积累的未使用卷会持续占用磁盘空间——尤其当构建任务频繁创建临时数据库、缓存目录或测试数据卷时。与容器和镜像不同,卷默认不会随容器删除而自动清理,必须主动识别并回收。 识别哪些卷属于“垃圾” 真正需要清理的是 未被任何容器引用、且无明确业务用途的孤立卷 。注意区分以下情况: 由CI任务动态创建但容器已退出、未显式删除的卷(如
jenkins-data-20260525-abc
) 命名含临时标识的卷:例如包含
tmp
、
test
、
ci-
、
build-
等前缀/后缀 创建时间超过7天且从未被容器挂载使用的卷(可通过
docker volume inspect
查看
CreatedAt
) 排除明确保留的卷:如
redis-data
、
postgres-volume
等生产级持久化卷 用脚本实现安全巡检+分级清理 不建议直接执行
docker volume prune -f
——它会无差别删除所有未使用卷,存在误删风险。推荐分两步走: 巡检阶段 :每天生成报告,列出疑似垃圾卷及创建时间、大小、是否被引用 清理阶段 :仅对满足条件(如创建超7天 + 名称含
ci-
或
tmp
)的卷执行
docker volume rm
示例脚本核心逻辑:
#!/bin/bash # /usr/local/bin/docker-volume-cleanup.sh THRESHOLD_HOURS=168 # 7天 EXCLUDE_PATTERNS=("redis-data" "postgres-volume" "nexus-data")

获取所有卷名列表

VOLS=$(docker volume ls -q 2>/dev/null)

Docker Desktop(windows)

当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。

下载

for vol in $VOLS; do

跳过排除列表中的卷

skip=false for pattern in "${EXCLUDE_PATTERNS[@]}"; do if [[ "$vol" == "$pattern" ]]; then skip=true break fi done [[ "$skip" == true ]] && continue

检查是否被容器引用

if docker ps -a --format '{{.Names}}' | grep -q "$vol"; then continue fi

检查创建时间(需 Docker 20.10+ 支持 CreatedAt 字段)

created_at=$(docker volume inspect "$vol" 2>/dev/null | jq -r '.[0].CreatedAt' 2>/dev/null) if [[ -n "$created_at" ]]; then created_ts=$(date -d "$created_at" +%s 2>/dev/null) now_ts=$(date +%s) age_hours=$(( (now_ts - created_ts) / 3600 )) if [[ $age_hours -gt $THRESHOLD_HOURS ]] && [[ "$vol" =~ ^(ci-|tmp|test-|build-) ]]; then echo "$(date): [TO CLEAN] Volume '$vol' ($age_hours hrs old)" | logger -t docker-volume docker volume rm "$vol" 2>/dev/null && echo "✓ Removed $vol" fi fi done

集成到CI/CD运维体系 让清理行为可追溯、可监控、可回退: 定时执行 :通过
crontab
设置每日凌晨1:30运行,例如:
30 1 * * * /usr/local/bin/docker-volume-cleanup.sh >> /var/log/docker-volume-cleanup.log 2>&1
日志归档 :记录每次清理的卷名、大小(可用
du -sh /var/lib/docker/volumes/$vol/_data
预估)、操作结果 磁盘联动告警 :当
df -h /var/lib/docker
使用率 >75% 时,触发紧急清理(追加执行
docker volume prune -f
并发通知) CI任务内嵌防护 :在Jenkins Pipeline或GitHub Actions中,构建结束前添加
docker volume rm ${VOLUME_NAME}
显式清理临时卷 验证清理效果与避免误删 执行后务必验证两点: 运行
docker system df -v
查看 volumes 部分的
RECLAIMABLE
是否下降 检查关键服务容器是否仍能正常启动(确认未误删其依赖卷) 首次部署时先在非生产构建机上试运行一周,观察是否有任务因卷缺失失败 卷清理不是“越狠越好”,关键是建立识别规则+留痕机制。只要排除策略写得准、执行有日志、清理可回溯,就能在保障稳定性前提下释放大量闲置空间。

相关文章