it-swarm.com.de

Docker-Container wird nach "Docker-Run -d" automatisch angehalten

Laut Tutorial, das ich bisher gelesen habe, wird mit "docker run -d" ein Container aus dem Bild gestartet und der Container wird im Hintergrund ausgeführt. So sieht es aus, wir können sehen, dass wir bereits eine Container-ID haben.

[email protected]:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

Aber wenn ich "docker ps" lief, wurde nichts zurückgegeben.

Also habe ich "docker ps -a" ausprobiert, ich kann den Container bereits verlassen sehen:

[email protected]:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

Irgendwas was ich falsch gemacht habe? Wie kann ich dieses Problem beheben?

207
J John

Das centos dockerfile hat einen Standardbefehl bash.

Das heißt, wenn die Shell im Hintergrund ausgeführt wird (-d), wird sie sofort beendet.

Update 2017

Neuere Docker-Versionen berechtigen dazu, einen Container sowohl im getrennten Modus als auch im Vordergrundmodus auszuführen. (-t, -i oder -it)

In diesem Fall benötigen Sie keinen zusätzlichen Befehl und das ist genug:

docker run -t -d centos

Die Bash wird im Hintergrund warten.
Das wurde ursprünglich in kalyani-chaudhari s Antwort berichtet und in Jersey Bean beschrieben ) s Antwort .

[email protected]:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

Beachten Sie, dass für Alpine, Marinos An Berichte in den Kommentaren :

docker run -t -d Alpine/git hält den Prozess nicht aufrecht.
Musste tun: docker run --entrypoint "/bin/sh" -it Alpine/git


Ursprüngliche Antwort (2015)

Wie in diesem Artikel erwähnt :

Anstatt mit docker run -i -t image your-command zu arbeiten, wird die Verwendung von -d empfohlen, da Sie Ihren Container mit nur einem Befehl ausführen können und nicht das Terminal des Containers durch Drücken von trennen müssen Ctrl + P + Q.

Es gibt jedoch ein Problem mit der Option -d. Ihr Container stoppt sofort, es sei denn, die Befehle werden nicht im Vordergrund ausgeführt .
Docker setzt voraus, dass Ihr Befehl weiterhin im Vordergrund ausgeführt wird. Andernfalls wird davon ausgegangen, dass Ihre Anwendungen den Container stoppen und herunterfahren.

Das Problem ist, dass einige Anwendungen nicht im Vordergrund ausgeführt werden. Wie können wir es einfacher machen?

In dieser Situation können Sie Ihrem Befehl tail -f /dev/null hinzufügen.
Auf diese Weise wird Ihr Container nicht angehalten, auch wenn Ihr Hauptbefehl im Hintergrund ausgeführt wird, da der Schwanz weiterhin im Vordergrund ausgeführt wird.

Das würde also funktionieren:

docker run -d centos tail -f /dev/null

Ein docker ps zeigt an, dass der Centos-Container noch ausgeführt wird.

Von dort aus können Sie daran anhängen oder sich davon lösen (oder docker exec einige Befehle).

382
VonC

Gemäß dieser Antwort wird das Hinzufügen des -t-Flags verhindert, dass der Container im Hintergrund ausgeführt wird. Sie können dann docker exec -i -t <image> /bin/bash verwenden, um zu einer Shell-Eingabeaufforderung zu gelangen.

docker run -t -d <image> <command>

Es scheint, dass die Option -t nicht sehr gut dokumentiert ist , obwohl die Hilfe besagt, dass "ein Pseudo-TTY zugewiesen wird".

46
cjsimon

Hintergrund

Ein Docker-Container führt einen Prozess (den "Befehl" oder "Einstiegspunkt") aus, der ihn am Leben erhält. Der Container wird solange ausgeführt, wie der Befehl ausgeführt wird.

In Ihrem Fall wird der Befehl (standardmäßig /bin/bash bei centos:latest) sofort beendet (wie bash, wenn er nicht mit einem Terminal verbunden ist und nichts auszuführen ist).

Wenn Sie einen Container im Daemon-Modus (mit -d) ausführen, führt der Container normalerweise eine Art Daemon-Prozess (wie httpd) aus. In diesem Fall bleibt der Container aktiv, solange der httpd-Dämon aktiv ist.

Sie scheinen den Container am Leben zu erhalten, ohne dass ein Daemon-Prozess im Container ausgeführt wird. Dies ist etwas seltsam (da der Container erst dann etwas Nützliches tut, wenn Sie mit ihm interagieren, vielleicht mit docker exec), aber es gibt Fälle, in denen es sinnvoll sein könnte, so etwas zu tun.

(Wollen Sie zu einer Bash-Eingabeaufforderung im Container gelangen? Das ist einfach! docker run -it centos:latest)

Lösung

Eine einfache Möglichkeit, einen Container unbegrenzt im Daemon-Modus am Leben zu erhalten, besteht darin, sleep infinity als Befehl des Containers auszuführen. Dies erfordert nicht, dass Sie seltsame Dinge tun, wie z. B. das Zuweisen eines TTY im Dämonmodus. Obwohl es auf seltsame Dinge angewiesen ist, wie zum Beispiel sleep als Hauptbefehl.

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

Alternative Lösung

Wie von cjsimon angegeben, weist die Option -t eine "Pseudo-tty" zu. Dies führt dazu, dass Bash unbegrenzt weiterläuft, weil es der Meinung ist, dass es mit einem interaktiven TTY verbunden ist (auch wenn Sie keine Möglichkeit haben, mit diesem TTY zu interagieren, wenn Sie nicht -i übergeben). Jedenfalls sollte dies auch der Trick sein:

$ docker run -t -d centos:latest

Nicht zu 100% sicher, ob -t andere seltsame Interaktionen erzeugt. Hinterlassen Sie einen Kommentar, falls dies der Fall ist.

22
mkasberg

Hallo, dieses Problem liegt daran, dass Docker-Container beendet werden, wenn keine Anwendung im Container ausgeführt wird.

-d 

option ist nur, um einen Container im Deamon-Modus auszuführen.

Der Trick, den Container kontinuierlich laufen zu lassen, besteht darin, auf eine Shell-Datei im Andockfenster zu verweisen, wodurch die Anwendung weiter ausgeführt wird. Sie können es mit einer start.sh-Datei versuchen

Eg: docker run -d centos sh /yourlocation/start.sh

Diese start.sh sollte auf eine niemals endende Anwendung verweisen.

Falls Sie nicht möchten, dass eine Anwendung ausgeführt wird, können Sie monit installieren, wodurch Ihr Docker-Container aktiv bleibt. Bitte teilen Sie uns mit, ob diese beiden Fälle für Sie geeignet sind, um den Container aktiv zu halten.

Alles Gute

14
Pratik

Sie können erreichen, was Sie wollen mit:

docker run -t -d <image-name>

oder

docker run -i -d <image-name>

oder

docker run -it -d <image-name>

Der Befehlsparameter, wie er von anderen Antworten (d. H. Tail -f/dev/null) vorgeschlagen wird, ist vollständig optional und ist NICHT erforderlich, damit der Container im Hintergrund ausgeführt wird. 

Beachten Sie auch in der Docker-Dokumentation, dass die Kombination der Optionen -i und -t dazu führt, dass es sich wie eine Shell verhält.

Sehen:

https://docs.docker.com/engine/reference/run/#foreground

7
jersey bean

führen Sie den Befehl wie folgt aus:

docker run -t -d <image-name>

wenn Sie den Port angeben möchten, geben Sie den folgenden Befehl ein:

docker run -t -d -p <port-no> <image-name>

Überprüfen Sie den laufenden Container mit folgendem Befehl:

docker ps
6

Docker erfordert, dass Ihr Befehl im Vordergrund ausgeführt wird. Andernfalls wird davon ausgegangen, dass Ihre Anwendungen den Container stoppen und herunterfahren.

Wenn Ihr Docker-Eintragsskript ein Hintergrundprozess ist, wie folgt:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

Das '&' bewirkt, dass der Container angehalten und beendet wird, wenn später kein anderer Vordergrundprozess ausgelöst wird. Die Lösung ist also nur entfernen Sie das '&' oder lassen Sie ein anderes Vordergrund-CMD nachlaufen , z

tail -f server.log
4
Peiming Hu

Vielleicht liegt es mir aber nur an CentOS 7.3.1611 und Docker 1.12.6, aber ich musste am Ende eine Kombination der von @VonC & @Christopher Simon geposteten Antworten verwenden, um diese Funktion zuverlässig auszuführen. Nichts, was ich zuvor gemacht habe, konnte den Container nicht mehr beenden, nachdem CMD erfolgreich ausgeführt wurde. Ich starte Oracle-xe-11Gr2 und sshd.

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_Host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/Oracle-xe start && /sbin/sshd && tail -f /dev/null

Fügen Sie dann -d -t und -i hinzu, um auszuführen

docker run --shm-size=2g --name Oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-Oracle:7.3.1611 

Schließlich stundenlang meinen Kopf gegen die Wand geschlagen

ssh -v [email protected] -p 5022
...
[email protected]'s password: 
debug1: Authentication succeeded (password).

Aus irgendeinem Grund wird das Obige nach der Ausführung von CMD beendet, wenn das Endstück -f entfernt wird oder eine der Optionen -t -d -i weggelassen wird.

1
steven87vt

Ich hatte das gleiche Problem, nur das Öffnen eines anderen Terminals mit einer Bash darauf funktionierte für mich:

container erstellen:

docker run -d mcr.Microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

behälter starten:

docker start 52bbc9b30557

starte bash um den Container am Laufen zu halten:

docker exec -it 52bbc9b30557 bash

prozess starten, den Sie brauchen:

docker exec -it 52bbc9b30557 /path_to_cool_your_app
1
Steef

Ich habe diesen Code-Ausschnitt aus der ENTRYPOINT in meiner Docker-Datei ausgeführt:

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

Führen Sie das erstellte Docker-Image folgendermaßen aus:

docker run -td <image name>

Melden Sie sich beim Container Shell an:

docker exec -it <container id> /bin/bash
0
Binita Bharati

Wenn Sie CMD am Ende Ihrer Docker-Datei verwenden, können Sie den Code am Ende hinzufügen. Dies funktioniert nur, wenn Ihr Docker auf Ubuntu oder einem Betriebssystem basiert, das bash verwenden kann.

&& /bin/bash

Kurz sieht das Ende Ihrer Docker-Datei so aus.

...

CMD ls && ... && /bin/bash

Wenn also nach dem Ausführen Ihres Docker-Images automatisch etwas ausgeführt wird und die Aufgabe abgeschlossen ist, ist das Bash-Terminal in Ihrem Docker aktiv. Dabei können Sie Ihre Shell-Befehle eingeben.

0
Ekin

Ich habe es im folgenden Beitrag erklärt, der die gleiche Frage hat.

Wie bewahrt man den Docker Alpine Container nach "Exit" auf?

0
vimal krishna