AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Build bootable VM images from container images.
contemper takes an OCI image you already built, merges in what a given
virtualization target needs, and writes out a bootable disk. Authoring a
VM image becomes an ordinary container build.
is podman or docker; the two commands above are identical
either way. With Docker, contemper build runs the build and the
convert step together and skips the registry; see
Getting started for that walkthrough.README 전문 보기 ↗Build bootable VM images from container images.
contemper takes an OCI image you already built, merges in what a given virtualization target needs, and writes out a bootable disk. Authoring a VM image becomes an ordinary container build.
$ <tool> build -t registry.example.com/my-appliance:dev .
$ <tool> push registry.example.com/my-appliance:dev
$ contemper convert --target qemu registry.example.com/my-appliance:dev
$ contemper deploy --to local-qemu my-appliance-dev.aarch64/
<tool> is podman or docker; the two commands above are identical
either way. contemper build runs the build (with Docker buildx or
podman) and the convert step together and skips the registry; see
Getting started for that walkthrough.
Containers arguably became what they are because the Dockerfile made
image authoring easy and understandable. VM images are still mostly
built with heavier, more bespoke tooling: a separate toolchain with its
own base image conventions, build tools and registry habits, even though
the content (a filesystem plus a little metadata about how to boot it) is
the same kind of thing.
contemper bets that container authoring works just as well for VM images. You write a build file with the tools you already use, push and scan it like any other image, and contemper turns it into a disk. Building a custom VM image should feel no different from building a custom container image.
LABEL io.contemper.ready="true". contemper checks the label before
pulling any layers./boot/efi (GRUB, systemd-boot, shim for Secure
Boot), declared with LABEL io.contemper.boot="bootloader". The guest
then updates its own kernel with its package manager, so it can run as
a long-lived VM. contemper does not generate or install the
bootloader. See
choosing a boot mode./boot/efi tree; the root is a writable ext4 filesystem) plus
a contemper.json recording where it came from and the boot mode.| Tool | Authoring input | Runs code to build | Scope |
|---|---|---|---|
| contemper | any OCI image | no | image → bootable disk |
| bootc | Containerfile on a bootc base | yes (ostree) | image → disk and in-place updates |
| d2vm | Dockerfile or a Docker image | yes (docker build, chroot) | image → disk, several formats |
| Packer | provisioner scripts | yes (boots an instance) | broad; many clouds |
| mkosi | declarative config and packages | yes (distro installers) | OS images, systemd-centric |
| distrobuilder | YAML definitions | yes | Incus/LXC images |
bootc is the closest in idea: it shares the belief that container
authoring suits OS images. d2vm is the closest in workflow. The
differences from bootc: bootc starts from its own prescriptive
base images, while contemper accepts any base you install a kernel and
init system into (Alpine and OpenRC included). bootc gives
host-style semantics (/usr read-only, /etc and /var merged
forward) and transactional in-place updates of the image. contemper's
default (UKI) behaves like a container: a writable root kept across
reboots and replaced on redeploy, with persistent data on volumes.
Bootloader images can instead run as long-lived VMs that the distro's
package manager updates in place. What contemper lacks is an
image-based update mechanism of its own, nothing like bootc switch:
it stops at producing a disk.
d2vm also turns a Dockerfile or a Docker image into a VM disk, but
as a conversion tool: for a supported distribution it installs a
kernel, an init system and a bootloader into the image through
docker build, then assembles the disk with loop devices, mounts and a
chroot, which needs root. contemper takes all of that from the image,
runs nothing from it, and needs no root. d2vm covers what contemper
doesn't: BIOS boot, a LUKS-encrypted root, build-time settings such as
a root password, more disk formats and KubeVirt containerDisks.
Packer and virt-builder, in their common cloud-image workflow, customize an existing image by running code (Packer can also install a full OS from an ISO); mkosi and distrobuilder build from packages through their own config formats. contemper's input is whatever your container tooling already produces. More in docs/comparison.md.
contemper is pre-1.0: the CLI and the bundle format may still change.
Works today:
convert for the qemu and incus targets (the latter adds the Incus
agent through the default
incus-support
image), build (with Docker or podman), and deploy --to local-qemu.convert and deploy handle several architectures at once.VOLUME in your build file, and contemper
sizes, formats and mounts it in the guest through a first-boot helper,
persisted across redeploys for local-qemu instances.Planned: publish and deploy for Incus. See the
roadmap for the rest.
The documentation lives in docs/ and is published at
https://contemper-project.github.io/contemper/. Start with
Getting started, or read the
design for the reasoning behind the choices.
$ go build -o contemper ./cmd/contemper
$ make test # unit tests
$ make e2e # build, convert and boot the example image
convert needs e2fsprogs and qemu-img; deploy needs qemu-system-*
and UEFI firmware. See host tools.
Apache License 2.0, see LICENSE. The embedded systemd-stub binaries are LGPL-2.1-or-later; see NOTICE and internal/uki/stubs/README.md for where they come from and how to verify them.