Container crasht sofort - Exit-Codes verstehen und Fehler beheben
Container crasht sofort - Exit-Codes verstehen und Fehler beheben
Ein Container startet und ist sofort wieder weg — der Exit-Code sagt dir, was schiefgelaufen ist.
Exit-Code auslesen
docker ps -a
# Spalte STATUS: "Exited (137)" z. B.
# Oder gezielt:
docker inspect containername --format '{{.State.ExitCode}}'
Exit-Codes im Detail
Exit Code 0 — sauber beendet
Der Prozess hat sich selbst regulär beendet. Kein Fehler — aber wenn der Container dauerhaft laufen soll, fehlt restart: unless-stopped:
services:
myapp:
restart: unless-stopped
Ohne Restart-Policy startet Docker einen Container mit Exit 0 nicht neu.
Exit Code 1 — Applikationsfehler
Der häufigste Code. Die Anwendung selbst hat einen Fehler geworfen und ist abgestürzt. Ursachen: fehlende Umgebungsvariable, Datenbankverbindung schlägt fehl, Konfigurationsdatei nicht vorhanden.
docker logs containername
# Letzte Zeilen zeigen den Fehler
Exit Code 137 — OOMKilled
Der Linux-Kernel hat den Prozess via SIGKILL beendet — in Docker fast immer wegen Speichermangels.
docker inspect containername --format '{{.State.OOMKilled}}'
# true = OOMKilled
Lösung: Memory-Limit erhöhen oder die Anwendung optimieren:
deploy:
resources:
limits:
memory: 1g
Alternativ Swap auf dem Host aktivieren — Docker-Container können Host-Swap nutzen.
Exit Code 139 — Segmentation Fault
Der Prozess hat auf ungültigen Speicher zugegriffen. Mögliche Ursachen:
- Falsches CPU-Architektur: ARM-Image auf x86-Host (oder umgekehrt)
- Korruptes Binary im Image
- Bug in nativem Code (C/C++)
# Architektur des Images prüfen
docker inspect imagename --format '{{.Architecture}}'
# Host-Architektur
uname -m
Exit Code 126 — Permission denied
Der Entrypoint-Befehl ist nicht ausführbar:
docker run --entrypoint sh imagename -c "ls -la /entrypoint.sh"
# Wenn nicht executable: chmod +x fehlte im Dockerfile
Fix im Dockerfile:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
Exit Code 127 — Command not found
Der im ENTRYPOINT oder CMD angegebene Befehl existiert nicht im Container:
# Interaktiv prüfen
docker run -it --entrypoint sh imagename
which mycommand
echo $PATH
Häufige Ursache: falsch geschriebener Befehl im Dockerfile oder ein Binary das auf dem Build-System vorhanden war, aber nicht ins Image kopiert wurde.
Interaktiv debuggen
Wenn der Container sofort crasht, hilft der interaktive Modus mit überschriebenem Entrypoint:
docker run -it --entrypoint sh imagename
# Jetzt manuell den eigentlichen Startbefehl ausführen
Bei Images ohne Shell (Distroless):
# Debug-Variante des Images nutzen
docker run -it imagename:debug sh
State vollständig auslesen
docker inspect containername --format '{{json .State}}' | python3 -m json.tool
Gibt ExitCode, OOMKilled, Error, StartedAt, FinishedAt übersichtlich aus.
Zusammenfassung
| Exit Code | Bedeutung | Erste Maßnahme |
|-----------|-----------|----------------|
| 0 | Sauber beendet | restart: unless-stopped hinzufügen |
| 1 | App-Fehler | docker logs lesen |
| 137 | OOMKilled | Memory-Limit erhöhen |
| 139 | Segfault | Architektur prüfen, Image neu bauen |
| 126 | Entrypoint nicht ausführbar | chmod +x im Dockerfile |
| 127 | Befehl nicht gefunden | Entrypoint-Pfad und PATH prüfen |