Drone流水线偶发No space left on device报错但宿主机空间充足求解
可行解决方案
1. 清理Docker冗余资源(偶发报错最高发原因)
偶发磁盘不足但宿主机整体空间充足,绝大多数情况是Docker层面积累的冗余资源触碰到使用阈值,包括未清理的Drone构建临时容器、悬空镜像、废弃构建缓存、停止的旧容器等。
- 执行一次性全量清理命令:
该命令会清理所有未被使用的镜像、停止的容器、闲置网络、全量构建缓存,无需二次确认。docker system prune -af - 配置Docker自动缓存清理,避免后续重复出现问题:
编辑/etc/docker/daemon.json文件,新增以下配置:
保存后执行{ "builder": { "gc": { "enabled": true, "defaultKeepStorage": "20GB" } } }systemctl restart docker重启Docker服务生效,配置后Docker会自动清理超过20GB的构建缓存。
2. 调整Drone Runner资源配置
你当前提供的是Drone服务端的启动命令,实际执行构建任务的是Drone Runner组件,绝大多数的空间限制都是Runner的配置不合理导致:
- 启动Drone Runner时新增磁盘配额参数,将单构建容器的可写层上限调整为50GB(可根据实际需求修改大小):
docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -e DRONE_RPC_PROTO=https \ -e DRONE_RPC_HOST=drone.example.com \ -e DRONE_RPC_SECRET=super-duper-secret \ -e DRONE_RUNNER_CAPACITY=2 \ -e DRONE_RUNNER_NAME=runner-1 \ --storage-opt size=50G \ --restart always \ --name runner \ drone/drone-runner-docker:1 - 如果你使用Docker-in-Docker(dind)模式运行构建,需要额外给dind容器配置存储上限,启动时添加参数
--storage-opt dm.basesize=50G即可。
3. 调整Docker全局存储限制
如果需要全局修改所有容器的默认磁盘上限,可修改Docker全局配置:
编辑/etc/docker/daemon.json文件,新增存储驱动相关配置:
{ "storage-driver": "overlay2", "storage-opts": [ "overlay2.size=100G" ] }
保存后执行以下命令重启服务生效:
systemctl daemon-reload && systemctl restart docker
该配置会限制宿主机上所有容器的可写层最大为100GB,避免单容器无限制占用磁盘。
4. 流水线层面优化
部分场景是单流水线构建产生的临时文件过大导致,可从流水线侧优化:
- 在流水线步骤末尾增加临时文件清理逻辑,删除构建过程中产生的中间产物、依赖缓存、临时安装包等
- 开启Drone Runner的特权权限
DRONE_RUNNER_PRIVILEGED=true,配置后Runner会在每个构建任务结束后自动销毁对应容器和临时存储,避免残留。
排查技巧
下次出现报错时,可先在宿主机执行docker system df查看Docker各维度存储占用情况,可快速定位是镜像、容器还是缓存占用过高导致的问题。
内容的提问来源于stack exchange,提问作者112Legion
相关产品推荐
相关产品推荐

