在 Ubuntu 上把 Overlay(overlayfs) 集成到 CI(持续集成) 里,通常是为了:
下面按常见 CI 场景给你一套可落地的做法。
lowerdir (只读基础环境,如 ubuntu rootfs / docker image)
upperdir (可写层,每次 CI 新建)
workdir (overlay 必需的工作目录)
merged (最终挂载点,CI 实际运行目录)
示例:
/ci/lower # ubuntu 基础系统
/ci/upper # 本次构建写入
/ci/work
/ci/merged # CI 执行目录
sudo mkdir -p /ci/lower /ci/upper /ci/work /ci/merged
sudo mount -t overlay overlay \
-o lowerdir=/ci/lower,upperdir=/ci/upper,workdir=/ci/work \
/ci/merged
cd /ci/merged
./build.sh
sudo umount /ci/merged
sudo rm -rf /ci/upper/*
✅ 下次 CI 又是干净环境
GitHub Actions 示例
- name: Mount overlay
run: |
sudo mkdir -p /ci/lower /ci/upper /ci/work /ci/merged
sudo mount -t overlay overlay \
-o lowerdir=/ci/lower,upperdir=/ci/upper,workdir=/ci/work \
/ci/merged
- name: Run build
run: |
cd /ci/merged
make
- name: Cleanup
if: always()
run: |
sudo umount /ci/merged || true
sudo rm -rf /ci/upper/*
⚠️ 需要 self-hosted runner + Ubuntu + root 权限
Docker 本身就用 overlayfs,一般不需要手动 mount
docker run --rm \
-v $PWD:/src \
ubuntu:22.04 \
bash -c "cd /src && make"
如果你必须自定义 overlay:
docker run --privileged ubuntu bash
然后在容器里 mount overlay
适合做“轻量虚拟机 CI”
sudo systemd-nspawn \
--directory=/ci/merged \
--boot
Ubuntu 20.04+ 默认支持 overlayfs
lsmod | grep overlay
✅ 解决:
❌ mount: overlay: permission denied
→ 没 root / 没 --privileged
❌ workdir and upperdir must be same fs
→ upper/work 必须同文件系统
❌ CI 并发写同一 upper → 每个 job 用独立 upper 目录
| 场景 | 建议 |
|---|---|
| 普通 CI | 用 Docker |
| 需要完全控制文件系统 | Overlay + 自建 Runner |
| 多 job 并行 | 每 job 一个 upper |
| 构建缓存 | lower 做基础镜像 |
如果你能告诉我:
我可以直接帮你写一套 完整 CI 配置。