自建CI/CD构建代理Docker镜像存储与缓存优化方案咨询
自建CI/CD构建代理磁盘空间优化方案(保缓存+自动清理)
一、精准清理Docker缓存层,不碰核心依赖
- 按缓存生命周期分层清理:
- 锁死基础镜像缓存:把scratch、官方语言镜像这类更新慢的核心依赖打个
base标签,清理时直接排除,确保构建的核心缓存不被删。 - 定向清理临时构建镜像:除了当前正在运行的构建任务,以及最近3次成功构建的镜像(避免刚用的缓存被清),其余带BuildId的临时镜像全部删掉。
- 只清无主缓存:用
docker system prune -f(别加-a),只删无标签的悬空镜像和没被任何镜像引用的缓存层,不会影响有tag的有效缓存。
- 锁死基础镜像缓存:把scratch、官方语言镜像这类更新慢的核心依赖打个
- 用Docker筛选参数精准控范围:
- 清72小时前的非基础镜像:
docker image prune -f --filter "until=72h" --filter "reference!=*/base-*",时间阈值可根据构建频率调整,reference!=*/base-*用来跳过基础镜像。 - 清48小时未用的构建缓存:
docker builder prune -f --filter "until=48h",只清理近期没被用到的缓存,保留刚用过的加速构建。
- 清72小时前的非基础镜像:
二、给代理节点磁盘加“安全阀”
- 给Docker目录设配额:用Linux的quota工具或者LVM逻辑卷,给每个代理的
/var/lib/docker分配固定空间(比如50G),配合overlay2存储驱动,磁盘到阈值时Docker会自动触发缓存清理。 - 构建任务隔离磁盘空间:在Azure Pipeline里给每个任务设置临时工作目录的空间限制,防止单个任务生成超大临时文件直接占满磁盘。
三、自动化脚本一键搞定,不用人工盯
- 代理节点定时清理脚本(每天凌晨执行):
#!/bin/bash # 提取所有带base标签的基础镜像 BASE_IMAGES=$(docker image ls --format "{{.Repository}}:{{.Tag}}" | grep base) # 清理72小时前创建的非基础镜像 docker image prune -f --filter "until=72h" $(printf "--filter=reference!=%s " $BASE_IMAGES) # 清理48小时未用的构建缓存 docker builder prune -f --filter "until=48h" # 清理停止的容器和无引用的卷 docker container prune -f docker volume prune -f
- 构建后即时清理:在Azure Pipeline每个构建任务的最后加个脚本步骤,删掉当前任务的临时镜像和1小时内没用的缓存:
# 删除当前BuildId对应的镜像,失败也不终止流程 docker rmi img/address/image_name:$(Build.BuildId) || true # 清理本次构建产生的临时缓存 docker builder prune -f --filter "until=1h"
四、构建流程优化,从源头减占用
- 用BuildKit共享缓存:构建时加
--cache-from和--cache-to参数,把缓存传到私有镜像仓库共享,代理节点只保留本地近期缓存,减少本地磁盘压力。示例命令:
docker build --build-arg BUILDKIT_INLINE_CACHE=1 \ --cache-from=img/address/image-cache:latest \ --tag img/address/image_name:$(Build.BuildId) \ --push . # 更新共享缓存 docker push img/address/image-cache:latest
- 拆分大型构建:把单个服务的构建拆成多阶段,只保留最终镜像,中间阶段的缓存层构建完自动丢弃,配合BuildKit进一步压缩缓存体积。
内容的提问来源于stack exchange,提问作者Bhavesh Patil
相关产品推荐
相关产品推荐

