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?
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).
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".
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
)
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
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.
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
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:
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
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
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.
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
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
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.
Ich habe es im folgenden Beitrag erklärt, der die gleiche Frage hat.
Wie bewahrt man den Docker Alpine Container nach "Exit" auf?