You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自建CI/CD构建代理Docker镜像存储与缓存优化方案咨询

自建CI/CD构建代理磁盘空间优化方案(保缓存+自动清理)

一、精准清理Docker缓存层,不碰核心依赖

  • 按缓存生命周期分层清理:
    • 锁死基础镜像缓存:把scratch、官方语言镜像这类更新慢的核心依赖打个base标签,清理时直接排除,确保构建的核心缓存不被删。
    • 定向清理临时构建镜像:除了当前正在运行的构建任务,以及最近3次成功构建的镜像(避免刚用的缓存被清),其余带BuildId的临时镜像全部删掉。
    • 只清无主缓存:用docker system prune -f(别加-a),只删无标签的悬空镜像和没被任何镜像引用的缓存层,不会影响有tag的有效缓存。
  • 用Docker筛选参数精准控范围:
    • 清72小时前的非基础镜像:docker image prune -f --filter "until=72h" --filter "reference!=*/base-*",时间阈值可根据构建频率调整,reference!=*/base-*用来跳过基础镜像。
    • 清48小时未用的构建缓存:docker builder prune -f --filter "until=48h",只清理近期没被用到的缓存,保留刚用过的加速构建。

二、给代理节点磁盘加“安全阀”

  • 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:48:23