Kurze Antwort
Wenn ein Docker-Container sofort beendet wird, prüfen Sie zuerst `docker logs` und den Exit-Code. Die häufigsten Ursachen sind ein falscher Startbefehl, eine Anwendung, die sofort beendet wird, fehlende Konfiguration oder Berechtigungen und ein Container, der keinen Vordergrundprozess hat. Korrigieren Sie den Befehl oder Entrypoint und starten Sie den Container interaktiv, um den Fehler zu sehen.
So erkennen Sie das Problem
- `docker ps` zeigt den Container nicht an, aber `docker ps -a` führt ihn als Exited
- Der Container startet und verschwindet innerhalb weniger Sekunden
- In den Logs steht nichts oder nur eine Fehlermeldung beim Start
- Die Anwendung läuft lokal, beendet sich im Container aber sofort
- Der Exit-Code ist 0, 1, 127 oder 137
Häufigste Ursachen
Falscher Startbefehl oder Entrypoint
Wenn im Dockerfile oder im `docker run`-Befehl ein nicht existierender Befehl angegeben ist, beendet sich der Container mit Code 127. Prüfen Sie, ob der Pfad zur ausführbaren Datei korrekt ist und ob der Befehl im von Docker erwarteten Format vorliegt.
Anwendung beendet sich sofort
Der Container lebt, solange der Hauptprozess läuft. Wenn die Anwendung nur etwas ausführt und dann endet oder im Hintergrund gestartet wird, wird der Container beendet. Der Hauptprozess muss im Vordergrund bleiben.
Fehlende Konfiguration oder Berechtigung
Die Anwendung kann abstürzen, wenn Umgebungsvariablen, eine Konfigurationsdatei oder Schreibberechtigungen fehlen. In den Logs sehen Sie dann einen Startfehler, zum Beispiel dass die Datenbank nicht erreichbar ist oder eine Datei nicht existiert.
Port oder Ressourcen
Wenn der Port belegt ist, kann der Start mit der Meldung fehlschlagen, dass der Port bereits verwendet wird. Der Container kann auch beendet werden, wenn nicht genügend Speicher vorhanden ist oder der Prozess aufgrund von Limits beendet wurde.
Abhängigkeit zwischen Diensten
In einer Docker-Compose-Umgebung startet ein Container möglicherweise nicht oder wird beendet, wenn ein abhängiger Dienst nicht bereit ist. Prüfen Sie die Reihenfolge und Bedingungen in `depends_on` und verwenden Sie einen Healthcheck, um zu prüfen, ob der abhängige Dienst tatsächlich bereit ist.
Lösung Schritt für Schritt
- 1
Status und Exit-Code prüfen
Führen Sie
docker ps -aaus, um alle Container einschließlich der beendeten anzuzeigen. Achten Sie auf die Spalte STATUS und den Exit-Code. Code 0 bedeutet, dass der Prozess normal beendet wurde, 1 ist ein allgemeiner Fehler, 127 ein nicht existierender Befehl und 137 deutet auf eine erzwungene Beendigung hin, oft wegen Speichermangels. - 2
Logs prüfen
Führen Sie
docker logs <Name_oder_ID>aus. Wenn der Container beendet ist, fügen Sie--tail 100hinzu, um die letzten hundert Zeilen zu sehen. Die Logs enthalten meist den genauen Grund, zum Beispiel einen Konfigurationsfehler oder die Meldung, dass der Befehl nicht gefunden wurde. - 3
Container interaktiv starten
Umgehen Sie den Startbefehl und gehen Sie in die Shell:
docker run -it --entrypoint /bin/sh <Image>. Wenn das Image keinshhat, versuchen Siebash. Starten Sie die Anwendung innerhalb des Containers manuell und sehen Sie den Fehler, den Sie sonst nicht sehen. - 4
Befehl und Entrypoint prüfen
Sehen Sie sich das Dockerfile und den
docker run-Befehl an. Stellen Sie sicher, dassCMDoderENTRYPOINTim richtigen Format vorliegen und der Pfad zur ausführbaren Datei existiert. Wenn Siedocker composeverwenden, prüfen Sie das Feldcommandindocker-compose.yml. - 5
Sicherstellen, dass der Hauptprozess im Vordergrund bleibt
Die Anwendung darf nicht im Hintergrund gestartet werden oder sofort enden. Wenn es sich um ein Skript handelt, fügen Sie am Ende eine Schleife hinzu oder starten Sie einen Server, der lauscht. Für Container, die nur aktiv bleiben sollen, verwenden Sie
tail -f /dev/nullals vorübergehende Lösung. - 6
Umgebungsvariablen und Konfiguration prüfen
Vergleichen Sie
docker inspect <Container>mit dem, was die Anwendung erwartet. Fügen Sie fehlende Variablen über-eoder im Abschnittenvironmenthinzu. Prüfen Sie auch, ob Konfigurationsdateien am richtigen Pfad eingebunden sind. - 7
Berechtigungen und Eigentümer prüfen
Wenn die Anwendung in ein Volume oder Verzeichnis schreibt, stellen Sie sicher, dass der Benutzer im Container die Berechtigung hat. Fügen Sie in
docker run--userhinzu oder passen Sie das Dockerfile an. Berechtigungsfehler erscheinen oft in den Logs alsPermission denied. - 8
Healthcheck und Abhängigkeiten deaktivieren
Wenn Sie Compose verwenden, kommentieren Sie vorübergehend
healthcheckunddepends_onaus, um zu sehen, ob der Container eigenständig läuft. Fügen Sie sie dann einzeln wieder hinzu und beobachten Sie das Verhalten. - 9
Image neu erstellen
Wenn Sie das Dockerfile geändert haben, führen Sie
docker build --no-cache -t <Name> .aus und starten Sie den Container erneut. Ein zwischengespeicherter Layer kann eine Änderung verbergen, die die Ursache des Problems ist.
Wenn nichts hilft
Aktivieren Sie detaillierteres Logging der Anwendung und starten Sie sie mit docker run ohne -d, um die Ausgabe live zu sehen. Prüfen Sie in docker inspect (Feld State.OOMKilled), ob der Container wegen OOMKilled beendet wird. Wenn Sie Kubernetes oder einen anderen Orchestrator verwenden, sehen Sie sich die Ereignisse und den Restart-Count an. Wenn das Problem in der Anwendung selbst liegt, starten Sie sie außerhalb des Containers mit denselben Umgebungsvariablen, um Docker zu isolieren. Bei komplexen Fällen mit mehreren Diensten ist es hilfreich, eine minimale docker-compose.yml mit nur einem Dienst zu erstellen und die anderen schrittweise hinzuzufügen.
So beugen Sie vor
- Verwenden Sie immer `docker logs` und den Exit-Code, bevor Sie etwas ändern.
- Geben Sie im Dockerfile explizit `CMD` oder `ENTRYPOINT` an und testen Sie es lokal.
- Bereinigen Sie gelegentlich beendete Container, ungenutzte Netzwerke und dangling Images mit `docker system prune`; prüfen Sie vor dem Ausführen, was entfernt wird, und erstellen Sie eine Sicherung wichtiger Daten.
- Definieren Sie in der Compose-Datei einen Healthcheck und `restart: unless-stopped` für Dienste, die dauerhaft laufen sollen.
Wann Sie einen Profi rufen sollten
Wenn Sie alle Schritte ausprobiert haben und der Container immer noch ohne klaren Grund beendet wird oder wenn das Problem mehrere Dienste und eine Produktionsumgebung betrifft, wenden Sie sich an den IT-Support, um Konfiguration und Logs gemeinsam zu analysieren.
Software- und Produktentwicklung · Individuelle Apps, SaaS und ein MVP in 4 bis 8 WochenHäufige Fragen
Warum wird der Container mit Exit-Code 0 beendet?
Exit-Code 0 bedeutet, dass der Hauptprozess erfolgreich beendet wurde, aber das heißt auch, dass der Container nichts mehr zu tun hat. Meist wurde die Anwendung im Hintergrund gestartet oder sofort beendet. Die Lösung ist, den Hauptprozess im Vordergrund zu halten.
Wie sehe ich einen Fehler, der nicht in den Logs erscheint?
Starten Sie den Container interaktiv mit `docker run -it --entrypoint /bin/sh <Image>` und starten Sie die Anwendung manuell. So sehen Sie die Ausgabe live. Sie können den Container auch vorübergehend mit `sleep 3600` als Befehl starten, bei Bedarf mit `--entrypoint`, und dann hineingehen und testen.
Was bedeutet Exit-Code 137?
Code 137 bedeutet normalerweise, dass der Prozess gewaltsam beendet wurde, meist wegen Speichermangels (OOM). Prüfen Sie `docker inspect` und das Feld `State.OOMKilled`. Erhöhen Sie den Speicher oder optimieren Sie die Anwendung.