systemctl, loginctl, or expects a session bus will fail.
--init auto hands PID 1 over to systemd. The rest of the guest then behaves like a normal Linux box.
Step 1: Boot
debian-systemd is one of the optional bases we maintain in guest-images for cases like this. --init auto uses a known init from the image ENTRYPOINT when one is declared, then falls back to probing common distro paths. Image-declared /init wrappers keep their OCI launch contract for attached msb run; bare systemd images still run your trailing command through agentd after boot. See Custom init system for the exact behavior and for pinning to an explicit path.
Step 2: Confirm systemd is PID 1
Step 3: Manage units
systemctl works as it does on bare metal. Inspect a unit shipped with the image:
policy-rc.d deferral install but don’t auto-start. systemctl enable --now <unit> starts them in one step.
Notes
- Image choice matters. Distroless / minimal images (
python:3.13-slim,alpine) don’t ship a systemd init binary;--init autowill fail if it cannot resolve a known image ENTRYPOINT init or find a guest-side probe match. Use a systemd-equipped base or layer one in. - Memory budget. systemd’s idle footprint is ~50 MiB; daemons add more. Bump
--memoryif your service is hungry. - Other inits work.
--initaccepts any absolute path. s6, OpenRC, runit, or a hand-rolled/sbin/initshell script are all fine;autocovers known image ENTRYPOINT inits plus common distro init paths.