Serie: Podman-Bausteine – Healthchecks (Teil 6)

  indibart   Lesezeit: 3 Minuten  🗪 2 Kommentare Auf Mastodon ansehen

Der Artikel erklärt das Konzept von Healthchecks (periodischer Befehl prüft Container-Gesundheit via Exit-Code) und zeigt, wie du sie über `--health-cmd`/`HealthCmd=` sowie Intervall, Retries und Timeout konfigurierst.

serie: podman-bausteine – healthchecks (teil 6)

Eine Tutorialreihe zum Einsatz von Podman: Anwendung, Vorteile und Funktionsweise.

Inhaltsverzeichnis

  1. Teil: Einleitung und Installation
  2. Teil: Podman CLI
  3. Teil: Wie funktioniert die Restart-Policy? Oder: Podman hat keinen Daemon
  4. Teil: Quadlets
  5. Teil: Updates
  6. Teil: Healthchecks (Das ist dieser Artikel)
  7. Teil: Ports publishing – rootful & rootless
  8. Teil: Volumes & Mounts
  9. Teil: Netzwerk: Kommunikation zwischen Containern
  10. Teil: Capabilities

Einleitung

Im letzten Teil haben wir gesehen, dass Podmans automatischer Rollback bei einem missglückten Update nur zuverlässig funktioniert, wenn Podman weiss, wann ein Container wirklich bereit ist – zum Beispiel über Notify=healthy. Dafür braucht es einen Healthcheck. Genau darum geht es in diesem Artikel: was Healthchecks sind, wie du sie definierst und wie du sie in unsere IT-Tools-Quadlet-Datei einbaust.

Healthchecks

Podman bietet genause wie Docker die Möglichkeit, automatisierte Healthchecks eines Containers durchzuführen.

Das Konzept ist simpel: Periodisch wird ein Befehl im Container ausgeführt. Wenn der sich mit Exit-Code 0 beendet, gilt der Container als gesund. Wenn der Exit-Code nicht 0 ist oder sich gar nicht erst beendet, gilt der Container als ungesund.

Healthchecks können direkt in die Images eingearbeitet werden. Falls das gemacht wurde, lassen sie sich mit dem Befehl podman image inspect unter dem Abschnitt „Config“ identifizieren.

Du kannst aber auch Healthchecks beim Erstellen von Containern festlegen. Der Befehl kann über das Flag --health-cmd beim podman run oder podman create gesetzt werden. In Quadlets wird er mittels HealthCmd= festgelegt. Bei unserem IT-Tools-Container würde folgender Befehl Sinn machen:

curl -Isf localhost:8080 > /dev/null

-I holt sich nur den Header, -s steht für Stiller Modus und -f/--fail sorgt dafür, dass curl bei HTTP-Fehlern und Verbindungsproblemen selbst non-zero zurückgibt. > /dev/null sendet alles, was curl heruntergeladen hat, zu /dev/null.

Wenn nichts anderes festgelegt ist, wird der Befehl alle 30 Sekunden ausgeführt, und es braucht drei Wiederholungen des Befehls ohne Exit-Code 0, damit der Container als ungesund gilt. Ausserdem hat der Befehl maximal 30 Sekunden Zeit, bevor der Healthcheck als fehlgeschlagen gilt. Mittels der folgenden Optionen kannst du dies ändern:

Quadlet Option CLI Option
HealthInterval=10s --health-interval=10s
HealthRetries=5 --health-retries=5
HealthTimeout=20s --health-timeout=20s

Weitere Optionen findest du in der Podman Dokumentation.

Healthchecks in unser Quadlet einbauen

Baue den Healthcheck und die Optionen in den zuvor erstellten Container-Quadlet ein, lade den systemd-Daemon neu und starte den Service neu.

cat $XDG_RUNTIME_DIR/containers/systemd/ittools.container
[Unit]
Description=IT Tools container

[Container]
AutoUpdate=registry
Image=ghcr.io/sharevb/it-tools:latest
PublishPort=8080:8080

HealthCmd=curl -Isf localhost:8080 > /dev/null
HealthInterval=1m
HealthRetries=5
HealthTimeout=20s

[Install]
WantedBy=multi-user.target default.target

[Service]
Restart=always
systemctl --user daemon-reload
systemctl --user restart ittools.service

Fazit und Ausblick

Du weisst jetzt, was Healthchecks sind, wie du sie mit --health-cmd/HealthCmd= definierst und über HealthInterval, HealthRetries und HealthTimeout konfigurierst. Damit hat auch der Rollback aus dem letzten Teil eine solide Grundlage.

Im nächsten Teil geht es um Port-Publishing: was sich zwischen rootful und rootless unterscheidet und worauf du dabei achten musst.

TL;DR

Healthcheck-Optionen in der Quadlet-Datei:

[Container]
HealthCmd=curl -Isf localhost:8080 > /dev/null
HealthInterval=1m
HealthRetries=5
HealthTimeout=20s

Änderungen übernehmen:

# ROOTLESS:
systemctl --user daemon-reload
systemctl --user restart ittools.service

# ROOTFUL:
sudo systemctl daemon-reload
sudo systemctl restart ittools.service

Quellen und Dokumentation

Tags

Podman, Healthchecks, HealthCmd, Quadlets

Naja
Geschrieben von Naja am 29. September 2026 um 18:56

Deine Reihe ist echt cool!

Wird das HealthCmd tatsächlich ohne Quotes angegeben? Kommt mir riskant vor...

indibart
Geschrieben von indibart am 4. Oktober 2026 um 14:31

Danke viel mal, das freut mich!

Zur Frage: Ja, ohne Quotes ist korrekt, ginge aber auch mit.

Quadlet macht aus der .container Datei eine systemd Unit Datei. Alle Podman-relevanten Key-Value-Paare werden dabei zu einem Podman-Bafehel umfunktioniert und als ExecStart-Zeile in die Unit Datei eingetragen. Systemd wiederum interpretiert ExecStart wie folgt: 1. Wort ist Binary, weitere Wörter sind Argumente. Dort muss also der Teil aus HealthCmd zwingend zwischen Quotes stehen. Quadlet macht das aber korrekt und setzt es zwischen Quotes. Daher: Alles korrekt so!

Um sicher zu sein, habe ich alles durchgespielt. Zuerst siehst du den HealthCmd, den ich ins Quadlet-File eingetragen habe, danach die Übersetzugn von Quadelt in --health-cmd. Wie du siehst, stimmt es tatsächlich immer. \x20 ist die hexadezimale Escape-Sequenz für ein Standard-Leerzeichen.

HealthCmd=curl -Isf localhost:8080 > /dev/null
--health-cmd "curl\x20-Isf\x20localhost:8080\x20>\x20/dev/null"

HealthCmd="curl -Isf localhost:8080 > /dev/null"
--health-cmd "curl\x20-Isf\x20localhost:8080\x20>\x20/dev/null"

HealthCmd='curl -Isf localhost:8080 > /dev/null'
--health-cmd "'curl\x20-Isf\x20localhost:8080\x20>\x20/dev/null'"

HealthCmd=curl -Isf localhost:8080 > /var/log/health-"$(date -I)"
--health-cmd "curl\x20-Isf\x20localhost:8080\x20>\x20/var/log/health-\"$(date\x20-I)\""

HealthCmd=curl -Isf localhost:8080 > /var/log/health-'$(date -I)'
--health-cmd "curl\x20-Isf\x20localhost:8080\x20>\x20/var/log/health-'$(date\x20-I)'"

HealthCmd="curl -Isf localhost:8080 > /var/log/health-'$(date -I)'"
--health-cmd "curl\x20-Isf\x20localhost:8080\x20>\x20/var/log/health-'$(date\x20-I)'"