diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..cd1229f --- /dev/null +++ b/Containerfile @@ -0,0 +1,66 @@ +# boco runner: compiles boco (static musl) AND the shared boco kernel (vmlinuz) +# with the slim config checked into the boco repo, then serves as the runtime +# image for `boco build` / `boco boot` under podman. +# +# Runtime requirements (boco shells out to nested rootless podman): +# --device /dev/kvm KVM accel for the VMs (entrypoint chmods it) +# --device /dev/net/tun only if nested container runs need pasta networking +# volume at /home/boco/.local/share/boco persistent registry (images+kernel) +# NO --privileged: the container's own userns (single mapping) is what makes +# nested `podman unshare` work; ignore_chown_errors handles unmapped uids. +# +# Kernel source: pinned tarball linux-7.2 (= 8d3ae59288f1e7d58d76558a6ee96d533bc5019f, +# verified == refs/tags/v7.2{} via git ls-remote), sha256-checked. + +FROM alpine:edge AS build +RUN apk add --no-cache rust cargo git +WORKDIR /src +COPY . . +# alpine's rust targets x86_64-alpine-linux-musl natively (static, no glibc dep) +RUN cargo build --release -p boco -p boco-init \ + && strip target/release/boco target/release/boco-init + +FROM alpine:3.22 AS kernel +# g++ for host tools, libelf for objtool, openssl for extract-cert +RUN apk add --no-cache make gcc g++ musl-dev perl flex bison bc \ + elfutils-dev openssl-dev findutils tar xz zstd curl linux-headers +WORKDIR /kbuild +# Pinned upstream tarball: linux-7.2.tar.xz, sha256 +# f9fef3d14c0df53819026f4be74459835c2a0b0dcbf5b5bbd9ea19f0829402b3. +# (Equivalent to user's shallow pin 8d3ae59288f1e7d58d76558a6ee96d533bc5019f +# = refs/tags/v7.2{} — verified via `git ls-remote`; the tarball avoids +# a multi-GB shallow clone through flaky slirp NAT.) +RUN curl -fsSLo /tmp/linux-7.2.tar.xz https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.2.tar.xz \ + && echo "f9fef3d14c0df53819026f4be74459835c2a0b0dcbf5b5bbd9ea19f0829402b3 /tmp/linux-7.2.tar.xz" | sha256sum -c - \ + && tar -xJf /tmp/linux-7.2.tar.xz \ + && mv linux-7.2 linux +# Install the slim kernel config checked into the boco repo; olddefconfig +# normalizes it against this tree and fails nothing silently afterwards. +COPY kernel/config /kbuild/linux/.config +RUN make -C linux olddefconfig HOSTCC=gcc CC=gcc \ + && grep -qE '^(# )?CONFIG_MODULES' linux/.config +RUN make -C linux -j"$(nproc)" bzImage HOSTCC=gcc CC=gcc \ + && cp linux/arch/x86/boot/bzImage /vmlinuz \ + && ls -lh /vmlinuz + +FROM alpine:3.22 +RUN apk add --no-cache \ + qemu-system-x86_64 qemu-img virtiofsd \ + podman fuse3 openssh-client ca-certificates iptables ip6tables \ + e2fsprogs cpio passt \ + && adduser -D -s /bin/sh boco \ + && echo boco:100000:65536 > /etc/subuid \ + && echo boco:100000:65536 > /etc/subgid \ + && mkdir -p /etc/containers \ + && printf '[storage]\ndriver = "vfs"\nrunroot = "/run/containers/storage"\ngraphroot = "/var/lib/containers/storage"\n[storage.options]\nignore_chown_errors = "true"\n' > /etc/containers/storage.conf \ + && printf '#!/bin/sh\n[ -e /dev/kvm ] && chmod 666 /dev/kvm\nexec /usr/local/bin/boco "$@"\n' > /usr/local/bin/entrypoint.sh \ + && chmod 755 /usr/local/bin/entrypoint.sh +COPY --from=build /src/target/release/boco /usr/local/bin/boco +COPY --from=build /src/target/release/boco-init /home/boco/.local/share/boco/boco-init +COPY --from=kernel /vmlinuz /home/boco/.local/share/boco/vmlinuz +RUN chmod 755 /usr/local/bin/boco /home/boco/.local/share/boco/boco-init /home/boco/.local/share/boco/vmlinuz +ENV XDG_DATA_HOME=/home/boco/.local/share +ENV XDG_DATA_HOME=/home/boco/.local/share +WORKDIR /data +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["image", "list"]