# syntax=docker/dockerfile:1.7 # Cloud Hypervisor, virtiofsd and the guest kernel for microvm sandboxes, # published as public.ecr.aws/n4e0e1y0/beta9-microvm:. # Worker images copy /microvm/bin and /microvm/share from the tag they pin, so # a worker release never rebuilds the kernel. # Cloud Hypervisor + virtiofsd # ======================== # Static release binaries, pinned and checksummed. virtiofsd publishes x86_64 # only; on arm64 the hypervisor ships but NewMicroVM reports the runtime # unavailable ("virtiofsd not found in PATH") rather than failing the build. FROM debian:bookworm AS tools ARG TARGETARCH ARG CLOUD_HYPERVISOR_VERSION=v53.0 ARG CLOUD_HYPERVISOR_AMD64_SHA256=448af3d4e59b22c2987f7df94c213ad40fb53a10d437e42b5ee6c4fce7c29ecc ARG CLOUD_HYPERVISOR_ARM64_SHA256=f192b510eea1c710cbc439d716bb0573c223fc463dbe3e6523788a2b7ef62850 ARG VIRTIOFSD_VERSION=v1.14.0 ARG VIRTIOFSD_AMD64_URL=https://gitlab.com/-/project/21523468/uploads/f505704014ae7a816e515f2a05a93d8b/virtiofsd-v1.14.0.zip ARG VIRTIOFSD_AMD64_SHA256=2e4fe9571f492b00baa34bc4e708e950039c5da05b830b31a8d179cb6ac8978e RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl unzip && rm -rf /var/lib/apt/lists/* RUN <&2 ;; *) echo "Unsupported architecture: $TARGETARCH" >&2; exit 1 ;; esac chmod 0755 /out/cloud-hypervisor if [ "$TARGETARCH" = "amd64" ]; then /out/cloud-hypervisor --version /out/virtiofsd --version fi EOT # Guest kernel # ======================== # Mainline longterm kernel with Cloud Hypervisor's reference config plus the # netfilter/bridge/IPv6 set Docker-in-VM needs (docker/microvm/). Everything # needed to boot is built in: the guest boots straight from the virtio-fs # root without an initramfs. Images can supply modules for passed-through GPUs. # amd64 only. FROM debian:bookworm AS kernel ARG TARGETARCH ARG GUEST_KERNEL_VERSION=6.12.111 ARG GUEST_KERNEL_SHA256=9e59dc67624188fa12a6601f9598499cd6662a9066be572b59f935e3d7849810 WORKDIR /build COPY docker/microvm/guest-kernel.config docker/microvm/guest-kernel.fragment docker/microvm/*.patch /build/beam/ RUN <&2 exit 0 fi apt-get update apt-get install -y --no-install-recommends \ bc bison build-essential ca-certificates cpio curl flex kmod libelf-dev \ libssl-dev patch perl python3 rsync xz-utils curl -fsSL "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${GUEST_KERNEL_VERSION}.tar.xz" -o linux.tar.xz echo "${GUEST_KERNEL_SHA256} linux.tar.xz" | sha256sum -c - tar -xJf linux.tar.xz --strip-components=1 rm linux.tar.xz # Guest-kernel fixes we carry until they land upstream (see each patch header). for p in beam/*.patch; do patch -p1 --forward < "$p"; done KCONFIG_CONFIG=.config scripts/kconfig/merge_config.sh -m beam/guest-kernel.config beam/guest-kernel.fragment make olddefconfig for opt in VIRTIO_FS VIRTIO_BLK VIRTIO_NET VIRTIO_VSOCKETS OVERLAY_FS EXT4_FS IPV6 NETFILTER NF_NAT \ IP_NF_IPTABLES IP_NF_NAT IP_NF_TARGET_MASQUERADE NETFILTER_XT_MATCH_ADDRTYPE \ NETFILTER_XT_MATCH_CONNTRACK BRIDGE BRIDGE_NETFILTER VETH CGROUPS MEMCG CGROUP_PIDS \ NAMESPACES DEVTMPFS_MOUNT SERIAL_8250_CONSOLE DEFERRED_STRUCT_PAGE_INIT \ MODULES MODULE_UNLOAD DRM DRM_KMS_HELPER DRM_FBDEV_EMULATION BPF_UNPRIV_DEFAULT_OFF; do grep -q "^CONFIG_${opt}=y" .config || { echo "guest kernel config lost CONFIG_${opt}" >&2; exit 1; } done grep -q '^# CONFIG_NUMA is not set$' .config || { echo "guest kernel must expose a single memory node" >&2; exit 1; } make -j"$(nproc)" vmlinux modules cp vmlinux /out/vmlinux cp .config /out/vmlinux.config EOT # Driver image builds consume the exact sources, generated headers and symbols # corresponding to the runtime artifact with the same content-derived tag. FROM scratch AS kernel-devel COPY --from=kernel /build/ /usr/src/beam-kernel/ FROM scratch AS runtime COPY --from=tools /out/ /microvm/bin/ COPY --from=kernel /out/ /microvm/share/