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

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

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.

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.)

0voto

Sibeesh Venu Punkte 15127

Es gibt viele mögliche Wege, um einen Docker sofort zu beenden. Für mich war das Problem mit meiner Dockerfile. Es gab einen Bug in dieser Datei. Ich hatte ENTRYPOINT ["dotnet", "M4Movie_Api.dll] anstelle von ENTRYPOINT ["dotnet", "M4Movie_Api.dll"]. Wie Sie sehen können, hatte ich ein Anführungszeichen(") am Ende vergessen.

Um das Problem zu analysieren, startete ich meinen Container und schloss ihn schnell an, um zu sehen, was das genaue Problem war.

C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b

C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b

Wo 4ea373efa21b ist meine Container-ID. Dies führt mich zum eigentlichen Problem.

Bildbeschreibung hier eingeben

Nachdem ich das Problem gefunden hatte, musste ich meinen Container erneut erstellen, wiederherstellen und veröffentlichen.

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