Sun, 26 Jul 2026 00:00:00 +0200
container, docker, ki, linux, podman, systemd, troubleshoot

Rootless Container via Systemd starten

Vor längerer Zeit hatte ich einen Dienst, der über Container für docker compose konzipiert war, erfolgreich mit podman-compose in Betrieb genommen und war ganz zufrieden damit.

Bis ich nach der Aktualisierung des Systems und Neustart der Maschine merkte, dass der Dienst nicht automatisch startete. Mit Docker war das kein Problem, aber ich hatte ja mit Bedacht podman verwendet und den Dienst unter einer separaten Nutzer-ID eingerichtet.

Allzuviel Zeit hatte ich nicht für das Problem, also befragte ich die aktuelle KI meines Vertrauens, den Kagi-Assistenten.

Da ich wusste, dass die Antworten um so besser werden, je präziser ich frage, stellte ich ihm die folgende Frage:

Wie kann ich Container die mit podman-compose mit einer von root verschiedenen UID auf Ubuntu 24.04 automatisch beim Start des Systems via systemd starten?

Der Assistent sah mir die grammatischen Fehler in der Frage nach und lieferte zwei Ansätze, von denen der erste Ansatz für mich funktionierte, so dass ich auf diesen hier etwas näher eingehen will.

Voraussetzungen

Beide Ansätze setzen voraus, dass auf der Maschine Systemd mit aktiviertem Lingering läuft. Andernfalls würde der Dienst nicht ohne aktive Login-Sitzung und somit nicht beim Systemstart laufen. Der dafür nötige Befehl lautet:

sudo loginctl enable-linger $user

Dabei steht $user für den Namen des Systemkontos, unter dem der Dienst läuft.

Service-Datei

Als nächstes galt es eine Service-Datei für Systemd zu erstellen, in diesem Fall für das Benutzerkonto $user.

mkdir -p ~/.config/systemd/user/
vi ~/.config/systemd/user/podman-compose@.service

Der Assistent hatte nano als Editor vorgeschlagen, aber da landen bei mir immer zu viele :wq im Text.

Die Datei selbst ist ein Template und sieht mit meinen Modifikationen nun so aus:

[Unit]
Description=%i podman-compose service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=%h/%i
ExecStart=/usr/bin/podman-compose -f %h/%i/docker-compose.yml up
ExecStop=/usr/bin/podman-compose -f %h/%i/docker-compose.yml down
# Beim Beenden Container nicht hängen lassen:
TimeoutStopSec=60
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Interessant waren für mich hier die Symbole %h und %i. Diese werden in der Handbuchseite systemd.unit erläutert:

%h steht für das Heimatverzeichnis des Benutzers und

%i steht für den Instanznamen der Unit, also den Teil, der zwischen dem @ und dem Suffix im Namen steht.

Habe ich die Datei docker-compose.yml also im Verzeichnis ~/meindienst/ abgelegt, dann kann ich den Dienst jetzt wie folgt aktivieren und starten:

systemctl --user daemon-reload
systemctl --user enable --now podman-compose@meindienst.service

Log-Ausgabe kontrollieren

Mit den folgenden Befehlen kontrolliere ich, ob der Dienst korrekt läuft:

systemctl --user status podman-compose@meindienst.service
journalctl --user-unit podman-compose@meindienst.service

Falls der Aufruf von journalctl eine Fehlermeldung bringt, kann es daran liegen, dass der Benutzer kein Mitglied der Gruppe systemd-journal ist. Das lässt sich mit folgendem Befehl beheben:

sudo usermod -aG systemd-journald $user

$user muss sich danach einmal ab- und anmelden.

Test mit Neustart

Um zu sehen, ob das Ziel tatsächlich erreicht ist, starte ich die Maschine einmal durch:

sudo reboot

Anschließend melde ich mich neu an und kontrolliere den Dienst:

podman ps
systemctl --user status podman-compose@meinprojekt.service

Alternativer Ansatz

Der zweite Ansatz war, Native Podman-Quadlets als moderne Alternative zu verwenden. Da ich mich damit noch nicht befasst hatte, und auch nicht so viel Zeit für das Problem aufwenden wollte, habe ich diesen zunächst nicht weiter verfolgt.

Dieser Artikel ist, wie oben erwähnt, mit Hilfe einer KI entstanden. Die Befehle und Dateiinhalte stammen von dieser und wurden von mir vor der Ausführung an die Gegebenheiten auf meinem System angepasst. Der Artikel selbst ist von mir.