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")
<h1>获取所有卷名列表</h1><p>VOLS=$(docker volume ls -q 2>/dev/null)</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill6198" title="Dolphindb Docker"><img
src="https://img.php.cn/upload/skill/000/000/081/179083807043363.jpg" alt="Dolphindb Docker" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill6198" title="Dolphindb Docker">Dolphindb Docker</a>
<p>自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。</p>
</div>
<a href="/xiazai/skill6198" title="Dolphindb Docker" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>for vol in $VOLS; do</p><h1>跳过排除列表中的卷</h1><p>skip=false
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
if [[ "$vol" == <em>"$pattern"</em> ]]; then
skip=true
break
fi
done
[[ "$skip" == true ]] && continue</p><h1>检查是否被容器引用</h1><p>if docker ps -a --format '{{.Names}}' | grep -q "$vol"; then
continue
fi</p><h1>检查创建时间(需 Docker 20.10+ 支持 CreatedAt 字段)</h1><p>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是否下降 - 检查关键服务容器是否仍能正常启动(确认未误删其依赖卷)
- 首次部署时先在非生产构建机上试运行一周,观察是否有任务因卷缺失失败
卷清理不是“越狠越好”,关键是建立识别规则+留痕机制。只要排除策略写得准、执行有日志、清理可回溯,就能在保障稳定性前提下释放大量闲置空间。

















