GitLab Runner宿主机Docker卷清理是解决磁盘爆满最有效手段;需先定位缓存卷(查config.toml、docker volume ls或绑定路径),再安全删除未被引用的卷,或清空活跃卷内node_modules等构建产物,并通过disable_cache或定时任务从源头控制。

直接清理 GitLab Runner 宿主机上 Docker 卷(Volumes)中积压的构建缓存,是解决磁盘爆满最常见也最有效的手段。关键不是“能不能删”,而是“删哪些、怎么删得安全又彻底”。
定位 GitLab Runner 实际使用的缓存卷
GitLab Runner 默认不会自动挂载特定命名卷,但多数生产配置会显式声明 /cache 或类似路径作为共享缓存目录。先确认它是否被映射为 Docker 卷:
- 查看 Runner 配置:cat /etc/gitlab-runner/config.toml,搜索 volumes = [...],重点关注类似 "/cache:/cache:rw" 的条目
- 若使用命名卷(如 gitlab-runner-cache),执行:docker volume ls | grep -i cache
- 若只是绑定挂载宿主机目录(如 /srv/gitlab-runner/cache),则直接检查该路径:du -sh /srv/gitlab-runner/cache
安全清理未被引用的缓存卷
对已确认不再被任何活跃 Runner 使用的卷,可手动删除;对仍在用的卷,必须进容器内部清理内容,而非删卷本身:
- 停止对应 Runner 服务:sudo gitlab-runner stop
- 列出所有卷并筛选出疑似缓存卷:docker volume ls --format "{{.Name}}\t{{.Driver}}\t{{.Mountpoint}}" | grep -E "(cache|runner|build)"
- 检查某卷是否被容器引用:docker ps -a --format "{{.Names}}\t{{.Mounts}}" | grep VOLUME_NAME(替换 VOLUME_NAME)
- 确认无引用后删除:docker volume rm VOLUME_NAME
清理活跃卷内的冗余缓存文件
如果卷正在被 Runner 使用(比如 /cache 绑定挂载),不能删卷,但可以清空其内部无用内容:
- 进入缓存目录:cd /srv/gitlab-runner/cache(或你配置的实际路径)
- 按修改时间排序,保留最近 7 天的子目录:find . -type d -mtime +7 -not -path "." -exec rm -rf {} + 2>/dev/null
- 或更稳妥方式:只清空各项目下 node_modules、target、build、dist、.m2 等典型构建产物目录:find . \( -name "node_modules" -o -name "target" -o -name "build" -o -name "dist" -o -name ".m2" \) -type d -exec rm -rf {} +
从源头控制:禁用或限制 Runner 缓存
避免问题反复发生,需调整 Runner 配置,让缓存不长期驻留:
- 编辑 /etc/gitlab-runner/config.toml,在对应 [[runners.docker]] 段落中添加或修改:
disable_cache = true(完全关闭缓存)
或
cache_dir = "/tmp/gitlab-runner-cache"(改用临时目录,重启即清) - 若必须启用缓存,建议配合 CI 脚本显式清理:
在 .gitlab-ci.yml 的 before_script 或 after_script 中加入:
rm -rf $CI_PROJECT_DIR/node_modules $CI_PROJECT_DIR/target - 设置定时任务每日清理(例如每天凌晨 2 点):
0 2 * * * sudo find /srv/gitlab-runner/cache -type f -mtime +3 -delete

















