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

406voto

camposer Punkte 4142

Dies hat bei mir funktioniert:

docker run -dit ubuntu

Danach habe ich mit dem Befehl überprüft, welche Prozesse gerade laufen:

docker ps -a

Um erneut an den Container anzuschließen

docker attach CONTAINER_NAME

TIPP: Um den Container zu verlassen, ohne ihn anzuhalten, geben Sie ein: ^P^Q

216voto

Adrian Mouat Punkte 41468

Ein Docker-Container wird beendet, wenn sein Hauptprozess endet.

In diesem Fall wird er beendet, wenn Ihr start-all.sh Skript endet. Ich weiß nicht genug über Hadoop, um Ihnen zu sagen, wie Sie es in diesem Fall machen können, aber Sie müssen entweder etwas im Vordergrund laufen lassen oder einen Prozessmanager wie runit oder supervisord verwenden, um die Prozesse auszuführen.

Ich glaube, Sie liegen falsch, wenn Sie denken, dass es funktioniert, wenn Sie -d nicht angeben; es sollte genau den gleichen Effekt haben. Ich vermute, Sie haben es mit einem etwas anderen Befehl gestartet oder -it verwendet, was die Dinge ändert.

Eine einfache Lösung könnte sein, etwas Ähnliches hinzuzufügen:

while true; do sleep 1000; done

am Ende des Skripts. Ich mag das jedoch nicht, da das Skript wirklich die Prozesse überwachen sollte, die es gestartet hat.

(Ich sollte sagen, dass ich diesen Code von https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh gestohlen habe.)

98voto

Krishna Gupta Punkte 1081

Ich würde gerne die Antwort, die von camposer erwähnt wurde, erweitern oder verbessern.

Wenn du ausführst

docker run -dit ubuntu

dann führst du im Grunde genommen den Container im Hintergrund im interaktiven Modus aus.

Wenn du den Container durch CTRL+D anhängst und beendest (die gängigste Methode), stoppst du den Container, weil du einfach den Hauptprozess getötet hast, mit dem du deinen Container mit dem obigen Befehl gestartet hast.

Indem du einen bereits laufenden Container nutzt, würde ich einfach einen anderen Prozess von bash abzweigen und ein Pseudo-TTY erhalten, indem ich ausführe:

docker exec -it  /bin/bash

88voto

RJFalconer Punkte 9608

Warum beendet sich der Docker-Container sofort?

Wenn Sie möchten, dass das Bild erhalten bleibt (um etwas zu debuggen oder den Zustand des Dateisystems zu untersuchen), können Sie den Einstiegspunkt überschreiben, um ihn in eine Shell zu ändern:

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

51voto

Thiago Ramos Punkte 609

Immer wenn ich möchte, dass ein Container nach Abschluss der Skriptausführung erhalten bleibt, füge ich hinzu

&& tail -f /dev/null

am Ende des Befehls. Es sollte also sein:

/usr/local/start-all.sh && tail -f /dev/null

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