You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit f56810d
Browse filesBrowse the repository at this point in the historyBrowse files
fix(ci): repair Docker builds on OSMO ephemeral runners
Every build_docker and build_packages test failed on the OSMO backend
because the inner dockerd kept its data-root on the pod's overlayfs
rootfs. Linux rejects a directory on overlayfs as an overlay upperdir,
so image pulls still succeeded -- containerd unpacks layers with plain
writes -- while every build step needing a real mount died with
"mount source: overlay ... err: invalid argument", surfacing as
unrelated-looking apt-get and WORKDIR failures.
runner-entrypoint.sh now picks a storage backend by attempting a real
overlay mount rather than trusting the filesystem type, preferring a
loopback ext4 data-root (real overlay2, sparse, dies with the pod) and
falling back to a pod-mounted filesystem, fuse-overlayfs, then vfs.
vfs is a last resort only: it copies the whole filesystem per layer and
would exhaust the storage request on the sim images.
Also bumps the GitHub Actions runner to 2.336.0, since 2.334.0 stops
being able to run jobs on 2026-08-10.
Co-authored-by: Cursor <cursoragent@cursor.com>
Copy file name to clipboardExpand all lines: .github/orchestrator/README.md
+47Lines changed: 47 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -257,3 +257,50 @@ nvidia-smi
257
257
|`Cannot connect to the Docker daemon` during tests | inner dockerd crashed | Read `/var/log/dockerd.log` via `osmo workflow exec`|
258
258
| Runner registered, then `pytest` failed | A normal test failure | Read the GitHub Actions log — the canonical view |
259
259
|`No space left on device`|`storage` too small for images + sim assets | Bump `storage` in `config.yaml`|
260
+
|`failed to solve: ... mount source: "overlay" ... err: invalid argument`| Docker data-root landed on the pod's overlay rootfs | See "Nested DinD and overlayfs" below |
261
+
262
+
### Nested DinD and overlayfs
263
+
264
+
The single most likely way to break every Docker build at once. The pod's root
265
+
filesystem is overlayfs, and **Linux refuses to use a directory on overlayfs as
266
+
an overlay `upperdir`** (it returns `EINVAL`). A dockerd whose data-root sits on
267
+
the pod rootfs looks healthy — `docker info` works, image pulls succeed, because
268
+
containerd unpacks layers with plain writes — and then every build step that
269
+
needs a real mount fails:
270
+
271
+
```text
272
+
failed to solve: process "/bin/bash -c apt-get ... " did not complete successfully:
That signature took out all four `build_docker` tests and all four
279
+
`build_packages` tests in one run, with each failure looking like an unrelated
280
+
`apt-get`/`WORKDIR` problem.
281
+
282
+
[`runner-entrypoint.sh`](runner-entrypoint.sh) handles this before starting
283
+
dockerd. It picks a storage backend by **performing a real overlay mount** to
284
+
test each option rather than trusting the filesystem type, and falls back in
285
+
this order:
286
+
287
+
| Order | Backend | Notes |
288
+
|---|---|---|
289
+
| 1 | Loopback ext4 image mounted at `/var/lib/docker`| Preferred. Real `overlay2`, self-contained, dies with the pod. Sparse, so it only consumes what Docker writes. Sized to free space on `/` minus 20 GiB, or `DOCKER_LOOP_SIZE_MB`. |
290
+
| 2 | A real filesystem already mounted in the pod | Kubernetes `emptyDir`/`hostPath`/PVC volumes live on the node disk, not the overlay rootfs. `/osmo/data/output` and `/osmo/data/socket` are skipped — the OSMO ctrl sidecar owns them. |
291
+
| 3 |`fuse-overlayfs` driver | Stacks where the kernel driver won't. Needs `/dev/fuse`. |
292
+
| 4 |`vfs` driver | Always works, copies the whole filesystem per layer. Too slow and too large for the sim images — **reaching this is a red flag**, not a working state. |
293
+
294
+
The chosen backend is logged at startup, so confirm it in the job log before
Copy file name to clipboardExpand all lines: AGENTS.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -277,6 +277,14 @@ GPU-required jobs (`runs-on: [self-hosted, airstack-ephemeral]`) execute on **ep
277
277
278
278
**Why ephemeral:** clean Docker cache per run, no leaked containers; the GitHub PAT and the OSMO service-account token live only on the orchestrator host (workers receive a single-use JIT token bound to one runner registration). CI authenticates to OSMO as a shared, non-personal [service account](https://nvidia.github.io/OSMO/main/deployment_guide/appendix/authentication/service_accounts.html) scoped to a dedicated CI GPU pool, so runs don't consume individuals' quotas. The CI pool's platform must have **"Privileged Mode Allowed"** enabled (docker-in-docker). State map at `/var/lib/airstack-orchestrator/state.json`; logs via `journalctl -u airstack-orchestrator.service -f`.
279
279
280
+
**Nested DinD needs a non-overlayfs Docker data-root.** The OSMO pod's root filesystem is overlayfs, and Linux rejects a directory on overlayfs as an overlay `upperdir` (`EINVAL`). A dockerd storing data on the pod rootfs pulls images fine but fails every build step that needs a real mount, with errors that masquerade as `apt-get`/`WORKDIR` failures:
281
+
282
+
```
283
+
failed to solve: ... mount source: "overlay", target: ".../buildkit/containerd-overlayfs/cachemounts/...", err: invalid argument
284
+
```
285
+
286
+
[`runner-entrypoint.sh`](.github/orchestrator/runner-entrypoint.sh) picks a backend by attempting a real overlay mount, preferring a loopback ext4 image at `/var/lib/docker` (real `overlay2`), then a real filesystem already mounted in the pod, then `fuse-overlayfs`, then `vfs`. Landing on `vfs` means builds will be slow and probably run out of disk — check the `[runner-entrypoint] storage:` line in the job log first when Docker builds misbehave. Details: [orchestrator README → Nested DinD and overlayfs](.github/orchestrator/README.md).
287
+
280
288
**Setup, debugging a failed job, and exec-into-worker procedures:**[`.github/orchestrator/README.md`](.github/orchestrator/README.md) (also exposed as [`tests/ci-cd-orchestrator.md`](tests/ci-cd-orchestrator.md) symlink for the docs site).
0 commit comments