473 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

3voto

Adam k Punkte 39

Hinzufügen

exec "$@"

am Ende meines Shell-Skripts war meine Lösung!

3voto

jkix Punkte 164

Wenn Sie docker compose verwenden, können Sie tty: true in Ihrer compose.yml als Argument unter einem bestimmten Dienst angeben:

services: 
  ubuntu_test:
    container_name: dev
    build:
      context: .

    tty: true

Weitere Details finden Sie in dieser Antwort: Docker Compose Container am Laufen halten

2voto

tripleee Punkte 155951

Wenn ich aus Duplikaten komme, sehe ich hier keine Antwort, die das sehr verbreitete Antipattern anspricht, die Hauptarbeitslast als Hintergrundjob auszuführen und sich dann zu wundern, warum Docker beendet wird.

Wenn Sie also haben

mein-haupt-ding &

dann entfernen Sie entweder das &, um den Job im Vordergrund auszuführen, oder fügen Sie

wait

am Ende des Skripts hinzu, um es auf alle Hintergrundjobs warten zu lassen.

Es wird dann immer noch beendet, wenn die Hauptarbeitslast beendet ist, also führen Sie dies vielleicht in einer while true-Schleife aus, um es dazu zu zwingen, für immer neu zu starten:

while true; do
    mein-haupt-ding &
    andere Dinge, die passieren müssen, während die Hauptarbeitslast im Hintergrund läuft
    vielleicht, wenn es solche Dinge gibt
    wait
done

(Beachten Sie auch, wie man while true schreibt. Es ist üblich, alberne Dinge wie while [ true ] oder while [ 1 ] zu sehen, die zufälligerweise funktionieren, aber nicht das bedeuten, was der Autor wahrscheinlich gedacht hat, dass sie bedeuten sollen.)

1voto

Jaydeep Ranipa Punkte 391

Ich habe die read shell-Anweisung am Ende hinzugefügt. Dadurch bleibt der Hauptprozess des Containers - das Startskript der Shell - aktiv.

1voto

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

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