from golang:1.21.6-alpine3.19 as build

workdir /src

copy . .

run \
  --mount=type=cache,id=gomod,target=/go/pkg/mod \
  --mount=type=cache,id=gobuild,target=/root/.cache/go-build \
   go test ./... \
&& go build -o /go/bin/init -trimpath .

# ------------------------------------------------------------------------
from alpine:3.19.0 as initrd

run apk add --no-cache xz

workdir /layer
run . /etc/os-release \
 && wget -O- https://dl-cdn.alpinelinux.org/alpine/v${VERSION_ID%.*}/releases/x86_64/alpine-minirootfs-${VERSION_ID}-x86_64.tar.gz |tar zxv

run apk add --no-cache -p . musl lvm2 lvm2-extra lvm2-dmeventd udev cryptsetup e2fsprogs btrfs-progs lsblk
run rm -rf usr/share/apk var/cache/apk

copy --from=build /go/bin/init .

# check viability
run chroot /layer /init hello

run find |cpio -H newc -o >/initrd

# ------------------------------------------------------------------------
from alpine:3.19.0
copy --from=initrd /initrd /
entrypoint ["base64","/initrd"]
