471 Stimmen

Warum beendet der Docker-Container sofort?

Ich führe einen Container im Hintergrund aus mit

 docker run -d --name hadoop h_Service

es beendet sich schnell. Aber wenn ich es im Vordergrund ausführe, funktioniert es einwandfrei. Ich habe die Logs überprüft mit

docker logs hadoop

Es gab keinen Fehler. Irgendwelche Ideen?

DOCKERFILE

 FROM java_ubuntu_new
 RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
 RUN dpkg -i cdh4-repository_1.0_all.deb
 RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add -
 RUN  apt-get update
 RUN apt-get install -y hadoop-0.20-conf-pseudo
 RUN dpkg -L hadoop-0.20-conf-pseudo
 USER hdfs
 RUN hdfs namenode -format
 USER root
 RUN apt-get install -y sudo
 ADD . /usr/local/
 RUN chmod 777 /usr/local/start-all.sh
 CMD ["/usr/local/start-all.sh"]

start-all.sh

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start
 /etc/init.d/hadoop-hdfs-datanode start
 /etc/init.d/hadoop-hdfs-secondarynamenode start
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start
 sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start
 /bin/bash

0voto

xavierbaez Punkte 9

Wenn Sie das Dockerfile von Containern überprüfen, zum Beispiel fballiano/magento2-apache-php

werden Sie sehen, dass am Ende seiner Datei folgender Befehl hinzugefügt wird: while true; do sleep 1; done

Jetzt empfehle ich, dass Sie dies tun

docker container ls --all | grep 127

Dann werden Sie sehen, ob Ihr Docker-Image einen Fehler hatte, wenn es mit 0 beendet wird, dann braucht es wahrscheinlich einen dieser Befehle, die für immer schlafen werden.

0voto

kta Punkte 18216

Der Docker-Container wird sofort beendet, wenn er keinen Vordergrundprozess hat, der eine Verbindung zum Benutzer-Terminal herstellt. Zum Beispiel läuft kein Webserver in diesem Container.

Es gibt einige Möglichkeiten, einen Vordergrundprozess zu erstellen. Eine Methode besteht darin, die Ausgabe auf /dev/null umzuleiten, damit der Container nicht sofort beendet wird. Danach können Sie den exec-Befehl mit dem Parameter -it verwenden, um ihn an Ihr Terminal anzuhängen.

docker run -d ubuntu tail -f /dev/null
docker exec -it 0ab99d8ab11c /bin/bash

0voto

richirm Punkte 481

$ docker run -di image

Es funktioniert.

0voto

Oscar Zhang Punkte 452

docker logs Informationen sind für mich normalerweise nicht hilfreich. Manchmal ist das Protokoll der App dasselbe wie die Ausgabe von docker logs, manchmal nicht.

docker inspect ist in den meisten Fällen auch nicht hilfreich, es sei denn, es handelt sich um einen sehr offensichtlichen Fehler.

Wenn Ihr Entrypoint oder der letzte Befehl fehlgeschlagen ist, suchen Sie einfach das Protokoll, das durch diesen Befehl generiert wurde. Behalten Sie das Container-Log über ein Volume auf Ihrem Host bei und überprüfen Sie das Protokoll.

Alternativ können Sie, wenn Sie eine interaktive Umgebung bevorzugen, Ihren Container in den Schlafmodus versetzen. Entrypoint sleep (egal wie lange Sie möchten), dann melden Sie sich im Container mit docker exec -it Container-ID sh an und führen Sie Ihren Entrypoint-Befehl manuell aus, um zu sehen, was passiert.

0voto

Versuchen Sie, diesen Befehl zu verwenden, er hat für mich funktioniert.

docker run -it --entrypoint=/bin/bash image

Hinweis: Das Wort "image" sollte durch das tatsächliche von Ihnen erstellte Docker-Image ersetzt werden. Der Container läuft jetzt (nach der Ausführung im Terminal)

Dies sind Container-Protokolle. 2024-04-24 11:23:42 Ich habe keinen Namen!@f1490d9a208e:/usr/src/app#

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X