温馨提示×

ubuntu overlay怎样集成ci

小樊
35
2026-10-03 20:01:03
栏目: 智能运维

在 Ubuntu 上把 Overlay(overlayfs) 集成到 CI(持续集成) 里,通常是为了:

  • 构建环境隔离(每次 CI 都用干净层)
  • 加速构建(复用只读基础层)
  • 多任务并行而不互相污染

下面按常见 CI 场景给你一套可落地的做法。


一、Overlay 在 CI 中的典型结构

lowerdir  (只读基础环境,如 ubuntu rootfs / docker image)
upperdir  (可写层,每次 CI 新建)
workdir   (overlay 必需的工作目录)
merged    (最终挂载点,CI 实际运行目录)

示例:

/ci/lower      # ubuntu 基础系统
/ci/upper      # 本次构建写入
/ci/work
/ci/merged     # CI 执行目录

二、在 Ubuntu CI 节点上挂载 Overlay

1. 准备目录

sudo mkdir -p /ci/lower /ci/upper /ci/work /ci/merged

2. 挂载 overlay

sudo mount -t overlay overlay \
  -o lowerdir=/ci/lower,upperdir=/ci/upper,workdir=/ci/work \
  /ci/merged

3. CI 中直接使用

cd /ci/merged
./build.sh

4. 构建结束后清理

sudo umount /ci/merged
sudo rm -rf /ci/upper/*

✅ 下次 CI 又是干净环境


三、和 CI 系统集成的三种方式

✅ 方式 1:Shell / Bash CI(GitHub Actions / GitLab Runner)

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 权限


✅ 方式 2:Docker + Overlay(推荐)

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


✅ 方式 3:systemd-nspawn + overlay(高级)

适合做“轻量虚拟机 CI”

sudo systemd-nspawn \
  --directory=/ci/merged \
  --boot

四、Ubuntu 内核 & 权限注意点

1. 内核支持

Ubuntu 20.04+ 默认支持 overlayfs

lsmod | grep overlay

2. CI 权限

  • 必须 root
  • 云 CI(GitHub hosted)通常 不支持

✅ 解决:

  • 自建 runner
  • 使用 Docker

五、常见坑

❌ 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 做基础镜像

如果你能告诉我:

  • 用 GitHub / GitLab / Jenkins / 其他?
  • 是否 Docker / 裸机 / 云?

我可以直接帮你写一套 完整 CI 配置。

0 踩