Skip to content

Hello from the other jailrun: OCI images as a jail setup source? #10

Description

@apbodrov

Hi! We're the other jailrun — a docker run-shaped OCI runtime for FreeBSD jails. Yes, two projects, both called jailrun, both started in 2026. Whatever prior anyone had on "who even builds FreeBSD jail tooling in 2026" — it was clearly miscalibrated, twice. Ours is younger and still pre-release, so the name headache is ours to deal with, not yours.

We think the two projects sit on adjacent layers rather than competing ones:

  • jrun is compose-shaped: declarative multi-jail stacks, dependency ordering, provisioning, plus the VM bootstrap that gives macOS/Linux hosts jails at all.
  • ours is docker run-shaped: pull an OCI image, classify every Linux ELF in it, substitute a native FreeBSD binary wherever an equivalent exists (pkg/ports), fall back to Linuxulator only for the irreducible. ZFS snapshot/clone as the image store.

The proposal

Today the way to provision a jrun jail is an Ansible playbook (local or Hub). Which means a jrun user can't just take postgres:16 from Docker Hub — someone has to have written a playbook for it first. An OCI setup provider would close that gap:

jail "postgres-16" {
  setup {
    pg { type = "oci"; image = "docker.io/library/postgres:16"; }
  }
  forward {
    pg { host = 6432; jail = 5432; }
  }
}

Mechanically this looks like it fits without violence to either architecture:

  • Your VM is a FreeBSD host, and bare FreeBSD is exactly what our runtime targets — it would run inside the VM, invoked by jrun at setup time.
  • Our store/bakery layers were deliberately built as separable seams: "give me a rootfs ZFS dataset for image X" is an existing API, independent of our own jail engine. jrun keeps owning the jail lifecycle — exec/forward/mount/supervision all stay yours; the OCI provider only replaces the provisioning step.
  • Stack-wise it's Python stdlib-only + shell-outs to skopeo/bsdtar/zfs. MIT licensed.

If there's any interest, we'd rather put together a prototype PR (a fork with type = "oci" wired end to end) than argue hypotheticals. And if this isn't a direction you want for jrun, that's a completely fine answer too — figured it was worth asking before we both keep building past each other.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions