Package: racker
Operating system containers for humans and machines.Documentation:https://github.com/cicerops/rackerSource code:https://github.com/cicerops/rackerPyPI:https://pypi.org/project/racker/AboutIntroductionRacker is an experimental harness tool for provisioning and launching
containers, with a focus onoperating system containers.By a “harness tool”, we mean a combination of image bakery and payload
launcher.The image bakery is based on modern and generic tools for creating machine
images likemkosiandPacker, as wellOCI-compliant container images. Container images can be acquired from both vendor-
specific and standardized distribution channels likeOCI-compliant image
registries.A payload is any of an interactive command prompt (shell), a single program
invocation, or a long-running daemon.DetailsRacker is …A lightweight wrapper aroundsystemd-nspawnto provide and launch
container environments for/withsystemd.A lightweight wrapper aroundvagrantto provide convenient access to all
things needing a full VM, like running Windows on Linux or macOS.A tribute to the authors and contributors of GNU, Linux, systemd, Python,
VirtualBox, Vagrant, Docker, Windows, Windows Docker Machine and countless
others.With Racker, you can …Launch interactive command prompts or invoke programs non-interactively
within a isolated and volatile Linux and Windows environments.Build upon the runtime harness framework to build solutions for running and
testing software packages in different environments, mostly run headless and
non-interactively.Runner backendsRacker has two different subsystems / runner backends, one for Linux and
another one for Windows.For running Linux operating system containers, Racker usessystemdandsystemd-nspawn. Provisioning of additional software is performed using the
native package manager of the corresponding Linux distribution.Operating system coverageOn the host side, Racker can run on Linux, macOS, and Windows. On the container
side, the following list of operating systems has been verified to work
well.LinuxAmazonLinux 2022Arch Linux 20220501CentOS 7-9Debian 9-12 and unstable (stretch, buster, bullseye, bookworm, sid)Fedora 35-37openSUSE 15 and latest (leap, tumbleweed)Oracle Linux 8Red Hat RHEL 8 and 9Rocky Linux 8SUSE SLES 15 and BCI:latestUbuntu LTS 20 and 22 (focal, jammy)Prior artThe aims of Racker are very similar toDocker,Podman,DistroboxandToolbox. However, there are also some differences.Most people running Linux probably want to usePodmanthese days. For more
background, enjoy readingContainer warsandContainer Tools Guide.Racker is currently based onsystemd-nspawnandVagrantinstead ofDockerorPodman.Racker’s focus is to provide easy provisioning and launchingOS containersaka.OS-level virtualization, usingsystemdas init process.The acquisition and provisioning of operating system images does not need any
special preparation steps, those are handled by Racker on the fly.Racker aims to provide concise usability by folding its usage into a single
command.Racker is written in Python instead of Golang or Bash.See alsoComparison with similar tools - more details.Aboutsystemd-nspawnsystemd-nspawnmay be used to run a command or OS in a light-weight
namespace container. In many ways it is similar tochroot, but more
powerful since it fully virtualizes the file system hierarchy, as well as
the process tree, the various IPC subsystems and the host and domain name.It is primarily intended for use in development, experimenting, debugging,
instrumentation, testing and building of software.It can easily be used to start containers capable of booting up a complete
and unmodified Linux distribution inside as normal system services.For learning more details aboutsystemd-nspawn, we strongly recommend to
read the more extensivesystemd-nspawn in a nutshell.SetupInstall prerequisites:apt-get update
apt-get install --yes systemd-container skopeo umoci python3-pip python3-venvInstall Racker:python3 -m venv .venv
source .venv/bin/activate
pip install racker --upgradeTo install the latest development version, use this command instead:pip install git+https://github.com/cicerops/racker --upgradeNoteIf you are not running Linux on your workstation, the documentation about
theRacker sandbox installationoutlines how to run this program within
a virtual machine using Vagrant.UsageRackerTherackerprogram aims to resemble the semantics of Docker by providing a
command line interface compatible with thedockercommand.# Invoke the vanilla Docker `hello-world` image.
# FIXME: Does not work yet.
# racker run -it --rm hello-world /hello
# racker run -it --rm quay.io/podman/hello

# Acquire rootfs images.
racker pull debian:bullseye-slim
racker pull fedora:37

# Launch an interactive shell.
racker run -it --rm debian:bullseye-slim bash
racker run -it --rm fedora:37 bash
racker run -it --rm docker://registry.access.redhat.com/ubi8/ubi-minimal /bin/bash
racker run -it --rm docker://quay.io/centos/centos:stream9 bash

# Launch a single command.
racker run -it --rm debian:11-slim hostnamectl
racker run -it --rm opensuse/tumbleweed hostnamectl
racker run -it --rm ubuntu:jammy /bin/cat /etc/os-release
racker run -it --rm registry.suse.com/suse/sle15 /bin/cat /etc/os-release
racker run -it --rm registry.suse.com/bci/bci-base:15.4 /bin/cat /etc/os-release
racker run -it --rm docker://ghcr.io/jpmens/mqttwarn-standard /usr/bin/hostnamectl

# Verbose mode.
racker --verbose run -it --rm fedora:37 hostnamectl

# Use stdin and stdout, with timing.
time echo "hello world" | racker run -it --rm fedora:37 cat /dev/stdin > hello
cat helloPostrojThe idea behindpostrojis to provide an entrypoint to a command line
interface implementing actions that don’t fit intoracker, mostly having a
more high-level character.Currently,postroj pkgprobeimplements a flavor offull system
integration/acceptance testingin order to test the soundness of actual
installed binary distribution packages, in the spirit ofautopkgtest.To do so, it implements the concept ofcuratedoperating system images,
whose labels have a different layout than labels of Docker filesystem images.Getting started:# List available images.
postroj list-images

# Acquire images for curated operating systems.
postroj pull debian-bullseye
postroj pull fedora-37

# Acquire rootfs images for all available distributions.
postroj pull --all

# Run a self test procedure, invoking `hostnamectl` on all containers.
postroj selftest hostnamectlPackage testing:# Run a self test procedure, invoking example probes on all containers.
postroj selftest pkgprobe

# Run two basic probes on different operating systems.
postroj pkgprobe --image=debian-bullseye --check-unit=systemd-journald
postroj pkgprobe --image=fedora-37 --check-unit=systemd-journald
postroj pkgprobe --image=archlinux-20220501 --check-unit=systemd-journald

# Run probes that need to install a 3rd party package beforehand.

postroj pkgprobe \
    --image=debian-stretch \
    --package=http://ftp.debian.org/debian/pool/main/w/webfs/webfs_1.21+ds1-12_amd64.deb \
    --check-unit=webfs \
    --check-network=http://localhost:8000

postroj pkgprobe \
    --image=debian-bullseye \
    --package=https://dl.grafana.com/oss/release/grafana_8.5.1_amd64.deb \
    --check-unit=grafana-server \
    --check-network=http://localhost:3000

postroj pkgprobe \
    --image=centos-8 \
    --package=https://dl.grafana.com/oss/release/grafana-8.5.1-1.x86_64.rpm \
    --check-unit=grafana-server \
    --check-network=http://localhost:3000PerformanceA SuT which just uses a dummy probe/bin/systemctlis-activesystemd-journaldon Debian 10 “buster” cycles quite fast, essentially demonstrating that the
overhead of environment setup/teardown is insignificant.time postroj pkgprobe --image=debian-buster --check-unit=systemd-journald

real    0m0.589s
user    0m0.161s
sys     0m0.065sOn a cold system, where the filesystem image would need to be acquired before
spawning the container, it’s still fast enough:time postroj pkgprobe --image=debian-bookworm --check-unit=systemd-journald

real    0m22.582s
user    0m8.572s
sys     0m3.136sQuestions and answersQ: How does it work?A: Directly quoting themachinectldocumentation here:Note thatsystemd-runwith its--machine=switch may be used in place of themachinectl shellcommand, and allows non-interactive operation, more detailed and
low-level configuration of the invoked unit, as well as access to runtime and exit
code/status information of the invoked shell process.In particular, usesystemd-run’s--waitswitch to propagate exit status information
of the invoked process. Usesystemd-run’s--ptyswitch for acquiring an interactive
shell, similar tomachinectl shell. In general,systemd-runis preferable for
scripting purposes.Q: How does it work, really?A: Roughly speaking…skopeoandumociare used to acquire root filesystem images from Docker image registries.systemd-nspawnis used to run commands on root filesystems for provisioning them.Containers are started withsystemd-nspawn--boot.systemd-runis used to interact with running containers.machinectlis used to terminate containers.Q: How is this project related with Docker?A: The runtime is completely independent of Docker, it is solely based onsystemd-nspawncontainers instead. However, root filesystem images can be
pulled from Docker image registries in the spirit ofmachinectl pull-dkr.
Other than this, therackercommand aims to be a drop-in replacement for
its correspondingdockercounterpart.Q: Do I need to have Docker installed on my machine?A: No, Racker works without Docker.Q: How are machine names assigned?A: Machine names for spawned containers are automatically assigned.
The name will be assembled from the distribution’sfullnameattribute,
prefixed withpostroj-.
Examples:postroj-debian-buster,postroj-centos-8.Q: Does the program need root privileges?A: Yes, the program currently must be invoked withrootor correspondingsudoprivileges. However, it would be sweet to enable unprivileged
operations soon.systemd-nspawnshould be able to do it, using--private-usersor--user?Q: Where does the program store its data?A: Data is stored at/var/lib/postroj.
In this manner, it completely gets out of the way of any other images, for
example located at/var/lib/machines. Thus, any images created or managed
by Racker will not be listed bymachinectllist-images.A: The download cache is located at/var/cache/postroj/downloads.Q: Where are the filesystem images stored?A: Activated filesystem images are located at/var/lib/postroj/images.Q: How large are curated filesystem images?A: The preference for curated filesystem images is to use their corresponding
“slim” variants where possible, aiming to only use artefacts with download
sizes < 100 MB.Q: Are container disks ephemeral?A: Yes, by default, all container images will be ephemeral, i.e. all changes to
them are volatile.TroubleshootingIt’s always the cable. ;]If you see that your container might not have network access, make sure to
provide a valid DNS configuration in your host’s/etc/resolv.conf.
When in doubt, please addnameserver 9.9.9.9as the first entry.