自建GitHub Actions服务器数小时内磁盘空间耗尽问题求助
解决方案:让GitHub Actions容器完全不写入磁盘
针对你的场景,完全可以实现让GitHub Actions生成的容器不写入磁盘,核心是利用tmpfs内存挂载结合Docker参数配置,彻底避免磁盘占用,同时配合容器自动清理机制解决悬空容器问题。
1. 单个Job级别的临时配置
直接在GitHub Actions的Job容器配置中添加options参数,指定tmpfs挂载点,将容器内需要写入的目录挂载到内存中:
build-js-servers: name: Build JS Servers runs-on: [self-hosted, docker] container: image: node:16 options: >- --rm --tmpfs /tmp:rw,noexec,nosuid,size=2G --tmpfs /usr/src/app:rw,noexec,nosuid,size=4G --tmpfs /root:rw,noexec,nosuid,size=1G
--rm:容器停止后自动删除,彻底避免悬空容器--tmpfs:指定容器内路径挂载到内存,size限制该挂载点的内存使用量,根据你的构建需求调整;rw允许写入,noexec/nosuid提升安全性
需要根据实际构建流程调整挂载点,比如你的JS构建会写入/node_modules或/build目录,就添加对应的--tmpfs参数。
2. 全局运行器级别的批量配置
如果要让所有自托管运行器上的Job都默认启用该机制,不需要逐个修改Job:
- 在自托管运行器的启动脚本中添加环境变量
ACTIONS_RUNNER_CONTAINER_OPTIONS,指定默认的Docker参数:export ACTIONS_RUNNER_CONTAINER_OPTIONS="--rm --tmpfs /tmp:size=2G --tmpfs /usr/src/app:size=4G" ./run.sh - 或者修改运行器的配置文件(
runner/.runner),在env字段中添加上述环境变量,确保每次启动都生效。
3. 额外优化:禁用Docker镜像缓存
如果构建过程中会拉取或生成镜像,还可以禁用Docker的镜像缓存,避免无用镜像占用磁盘:
在Job中添加前置步骤执行无缓存构建:
docker build --no-cache -t your-image .
或者修改Docker daemon配置(/etc/docker/daemon.json),自动清理缓存:
{ "features": { "buildkit": true }, "buildkit": { "gc": { "enabled": true, "policy": {"keepStorage": "0GB"} } } }
修改后重启Docker daemon:systemctl restart docker
效果说明
通过tmpfs挂载,容器内的所有写入操作都在内存中完成,Job结束后容器被--rm参数自动删除,内存立即释放,完全不会在磁盘上留下任何容器或镜像相关的文件,彻底解决磁盘耗尽和SSD损耗问题。
内容的提问来源于stack exchange,提问作者spierce7
相关产品推荐
相关产品推荐

