builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder: idmapped-mount rootfs for multi-tenant runc
Present the build snapshot to a user-namespaced RUN step through an
idmapped mount instead of recursively chowning it. open_tree plus
mount_setattr(MOUNT_ATTR_IDMAP) against a fresh user namespace maps the
on-disk ids into the container range at the VFS layer: ownership shifts
with no tree walk and no on-disk change, and per-file ownership survives
where the chown round-trip flattened it onto the mapped root. The OCI
runtime spec cannot idmap the rootfs itself, so the builder creates the
mount (new Builder.Idmap) and points runc root.path at it, the way
containerd's overlay snapshotter does. A kernel without mount_setattr,
or a filesystem that cannot idmap, falls back to the chown.
Multi-tenant RUN secrets are chowned to the mapped container-root id so
the namespaced step can read a mode-0600 secret.
Add container-escape hardening regressions: container root never maps to
host root, noNewPrivileges, a seccomp profile, dropped CAP_MKNOD and
CAP_AUDIT_WRITE, and a read-only secret bind. Verified end to end on
Linux via docker-test.sh (Alpine/musl, privileged).
Rides along with an in-progress network-spec extraction (Builder_spec
.Network) interleaved in runc_runtime.ml and the test runner; the two
cannot be separated without breaking the build.
builder: idmapped-mount rootfs for multi-tenant runc
Present the build snapshot to a user-namespaced RUN step through an
idmapped mount instead of recursively chowning it. open_tree plus
mount_setattr(MOUNT_ATTR_IDMAP) against a fresh user namespace maps the
on-disk ids into the container range at the VFS layer: ownership shifts
with no tree walk and no on-disk change, and per-file ownership survives
where the chown round-trip flattened it onto the mapped root. The OCI
runtime spec cannot idmap the rootfs itself, so the builder creates the
mount (new Builder.Idmap) and points runc root.path at it, the way
containerd's overlay snapshotter does. A kernel without mount_setattr,
or a filesystem that cannot idmap, falls back to the chown.
Multi-tenant RUN secrets are chowned to the mapped container-root id so
the namespaced step can read a mode-0600 secret.
Add container-escape hardening regressions: container root never maps to
host root, noNewPrivileges, a seccomp profile, dropped CAP_MKNOD and
CAP_AUDIT_WRITE, and a read-only secret bind. Verified end to end on
Linux via docker-test.sh (Alpine/musl, privileged).
Rides along with an in-progress network-spec extraction (Builder_spec
.Network) interleaved in runc_runtime.ml and the test runner; the two
cannot be separated without breaking the build.
docs: update MDX examples to the v constructor after create/make rename
The repo-wide create/make -> v rename (E332) updated the libraries but
left doc-comment and README MDX examples calling the old .create/.make
names, so dune test failed across ~17 packages (dsp, dune, gpt, jwt, loc,
mal, mbr, monitor, prometheus, qemu, requests h2, runc, scc, sqlite, srp,
sse, stripe). Point each example at the renamed constructor (.v).
Also fixes the stale doc references the Store de-functorization left:
{!Oci.Build.Make.*} -> {!Oci.Build.*} and {!Oci_server.Store.Memory} ->
{!Oci_server.Store.in_memory}.
Changelog and skill prose mentioning the historical names are left as-is.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.
builder, oci: split network-free packages out of the engine
opam resolves packages whole, so depending on any sub-library of builder or oci pulled the package's entire dependency set: runc, seatbelt and sqlite from the builder engine, and the requests/TLS/HTTP registry client from oci. A consumer that needs only the build model or the local OCI layer cache inherited the whole execution and network surface.
Extract the network-free cores into their own packages so they can be consumed without that surface: oci-layer (spec, local store, layer build), builder-spec (spec, plan, runtime, backend), builder-graph (the build DAG) and builder-opam (the opam binary-layer cache and solver). The engine and registry client now depend on these.