wasm-vm documentation
OCI workloads in the guest

Containers, with the boundary visible.

wasm-vm is not Docker Engine in a tab. The current work is an OCI image pipeline plus a small guest-side runner named wvrun. The page separates what has been exercised from what is still a boot-gated capstone.

OCI import and validation wvrun lifecycle and exec logic public busybox build has no wvrun

Public-demo caveat. The default public manifest is the small busybox initramfs. It does not imply that the deployed page includes the local-only Alpine container bundles or that the container UI is a live Docker daemon.

What the pipeline does

OCI layoutregistry blobs + index
Verifydigest each blob
Unpacksafe rootfs bundle
wvrunguest namespaces + exec

The native CLI can turn a verified OCI layout into a bundle with wasm-vm oci unpack <layout> --out <bundle>. The bundle contains a root filesystem, run.json, and flat configuration files so the guest runner does not need a JSON parser.

wasm-vm oci unpack <layout> --out <bundle>
wvrun <bundle>
wvrun --interactive <bundle>

Kernel capabilities that were audited

The pinned riscv kernel configuration enables the primitives needed by the current runner shape: PID, mount, network, UTS, user, and IPC namespaces; cgroup v2 controls; overlayfs; tmpfs; veth/bridge networking; and loop devices. The in-guest smoke test is important because a config symbol alone is not proof that the emulator implements the corresponding syscall and device path.

CapabilityUsed forCurrent proof
NamespacesPID, mount, UTS, IPC, network, and user isolation.Kernel audit plus in-guest smoke coverage.
cgroup v2Memory, PID, and CPU resource boundaries.Memory limit/OOM event is checked by the smoke test.
overlayfs + tmpfsRead-only bundle lower layer and writable upper layer.Override and whiteout behavior are exercised.
veth + bridgeGuest-side container network plumbing.Cross-network-namespace ping is exercised in the audit.
seccompFuture runc-style syscall filtering.Config is enabled; the current wvrun runner does not install the filter yet.

What wvrun actually provides

The runner creates an overlay, enters PID/mount/UTS/IPC namespaces, mounts fresh /proc and /dev, pivots into the bundle root, applies the bundle's argv/environment/cwd/user, and executes the image command with exit-code passthrough. Its lifecycle surface also includes detached runs, listing, logs, stop/remove, and exec into a running container.

wvrun run -d --name c1 <bundle>
wvrun ps
wvrun logs c1
wvrun stop c1
wvrun rm c1
wvrun exec -it c1 sh

Those commands describe the guest runner's checked-in interface. They are not a promise that every public page has a container-capable image or that all Docker CLI behavior is supported.

Image matrix: architecture, not service uptime

The current matrix records 9 of 9 surveyed riscv64 images passing digest-verified unpacking, entrypoint resolution, and whole-rootfs ELF purity: Alpine, BusyBox, nginx, httpd, Caddy, HAProxy, Redis, Memcached, and Postgres. This is a static pipeline result. It does not say that all nine have been booted and served successfully inside the emulator.

Read the result correctly. “9/9 passed” means the image bundle is structurally runnable and every ELF is riscv64 according to the matrix checks. The boot-and-service leg remains the E3.5-T05 capstone.

Current gaps

  • The public busybox image does not ship wvrun; the container-capable Alpine image is a local-only path.
  • Seccomp is enabled in the kernel configuration but is not yet installed by the current runner.
  • The full booted image/service matrix is deferred to the E3.5-T05 capstone and should not be inferred from the native fast path.
  • Unsupported architectures are rejected by the image validation path rather than translated into riscv64.

Source records