Laut dem Tutorial, das ich bisher gelesen habe, docker run -d
startet " " einen Container aus dem Image und der Container wird im Hintergrund ausgeführt. So sieht es aus, wir können sehen, dass wir bereits eine Container-ID haben.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Aber wenn ich " docker ps
" lief , wurde nichts zurückgegeben.
Also habe ich versucht " docker ps -a
", ich kann sehen, Container bereits verlassen:
root@docker:/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
Was habe ich falsch gemacht? Wie kann ich dieses Problem beheben?
docker run -it -d <image> /bin/bash
eine Bash-Shell interaktiv gestartet und den Container nicht geschlossen habe, weil der Shell-Prozess aktiv ist.Antworten:
Die Docker-Datei centos verfügt über einen Standardbefehl
bash
.Das heißt, wenn
-d
die Shell im Hintergrund ( ) ausgeführt wird, wird sie sofort beendet.Update 2017
Neuere Versionen von Docker berechtigen zum Ausführen eines Containers sowohl im getrennten Modus als auch im Vordergrundmodus (
-t
,-i
oder-it
).In diesem Fall benötigen Sie keinen zusätzlichen Befehl und dies reicht aus:
Die Bash wartet im Hintergrund.
Das war zunächst in berichtet kalyani-Chaudhari 's Antwort und detailliert in Jersey Bean ' s Antwort .
Beachten Sie, dass für alpine , Marinos Ein berichtet in den Kommentaren :
Ursprüngliche Antwort (2015)
Wie in diesem Artikel erwähnt :
Das würde also funktionieren:
A
docker ps
würde zeigen, dass der Centos-Container noch läuft.Von dort aus können Sie es anhängen oder von ihm trennen (oder
docker exec
einige Befehle).quelle
docker exec -it <yourContainer> bash
.Nach dieser Antwort
-t
verhindert das Hinzufügen des Flags, dass der Container beim Ausführen im Hintergrund beendet wird. Sie können dann verwendendocker exec -i -t <image> /bin/bash
, um in eine Shell-Eingabeaufforderung zu gelangen.Es scheint, dass die Option -t nicht sehr gut dokumentiert ist , obwohl die Hilfe besagt, dass sie "eine Pseudo-TTY zuweist".
quelle
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- funktioniert nicht für mich (Ubuntu 14.04.5): STATUS = Beendet (1) vor 4 SekundenHintergrund
Ein Docker-Container führt einen Prozess aus (den "Befehl" oder "Einstiegspunkt"), der ihn am Leben erhält. Der Container wird so lange ausgeführt, wie der Befehl ausgeführt wird.
In Ihrem Fall wird der Befehl (
/bin/bash
standardmäßig aktiviertcentos: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 aus (wiehttpd
). In diesem Fall bleibt der Container am Leben, solange der httpd-Dämon ausgeführt wird.Sie versuchen anscheinend, den Container am Leben zu erhalten, ohne dass ein Dämonprozess im Container ausgeführt wird. Dies ist etwas seltsam (weil der Container nichts Nützliches tut, bis Sie mit ihm interagieren, vielleicht mit
docker exec
), aber es gibt bestimmte Fälle, in denen es sinnvoll sein könnte, so etwas zu tun.(Wollten Sie zu einer Bash-Eingabeaufforderung im Container gelangen? Das ist einfach!
docker run -it centos:latest
)Lösung
Eine einfache Möglichkeit, einen Container im Dämonmodus unbegrenzt am Leben zu halten, besteht darin, ihn
sleep infinity
als Befehl des Containers auszuführen . Dies setzt nicht voraus, dass seltsame Dinge wie das Zuweisen eines TTY im Daemon-Modus ausgeführt werden. Obwohl es darauf ankommt, seltsame Dinge zu tun, wie die Verwendungsleep
als primärer Befehl.Alternative Lösung
Wie von cjsimon angegeben, weist die
-t
Option eine "Pseudo-tty" zu. Diese Tricks führen dazu, dass die Ausführung auf unbestimmte Zeit fortgesetzt wird, da angenommen wird, dass sie mit einem interaktiven TTY verbunden ist (obwohl Sie keine Möglichkeit haben, mit diesem bestimmten TTY zu interagieren, wenn Sie nicht bestehen-i
). Auf jeden Fall sollte dies auch den Trick tun:Nicht 100% sicher, ob
-t
andere seltsame Interaktionen hervorgerufen werden; Vielleicht hinterlassen Sie unten einen Kommentar, wenn dies der Fall ist.quelle
infinity
.Hallo, dieses Problem liegt daran, dass Docker-Container beendet werden, wenn im Container keine Anwendung ausgeführt wird.
Option ist nur, einen Container im Deamon-Modus auszuführen.
Der Trick, um Ihren Container kontinuierlich auszuführen, besteht darin, auf eine Shell-Datei im Docker zu verweisen, die Ihre Anwendung am Laufen hält. Sie können es mit einer start.sh-Datei versuchen
Diese start.sh sollte auf eine nie endende Anwendung verweisen.
Falls Sie nicht möchten, dass eine Anwendung ausgeführt wird, können Sie eine Installation installieren,
monit
die Ihren Docker-Container am Laufen hält. Bitte lassen Sie uns wissen, ob diese beiden Fälle für Sie funktioniert haben, um Ihren Container am Laufen zu halten.Alles Gute
quelle
Sie können erreichen, was Sie wollen:
oder
oder
Der von anderen Antworten vorgeschlagene Befehlsparameter (z. B. tail -f / dev / null) ist vollständig optional und NICHT erforderlich, damit Ihr Container im Hintergrund ausgeführt wird.
Beachten Sie auch, dass in der Docker-Dokumentation vorgeschlagen wird, dass das Kombinieren 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
quelle
Ich habe dieses Code-Snippet aus dem
ENTRYPOINT
in meiner Docker-Datei ausgeführt:Führen Sie das erstellte Docker-Image wie folgt aus:
Melden Sie sich bei der Container-Shell an:
quelle
Führen Sie den Befehl wie folgt aus:
Wenn Sie den Port angeben möchten, geben Sie den folgenden Befehl ein:
Überprüfen Sie den laufenden Container mit dem folgenden Befehl:
quelle
-t -d
vs-i -d
? Beides hält den Container am Laufen.Docker erfordert, dass Ihr Befehl weiterhin im Vordergrund ausgeführt wird. Andernfalls wird angenommen, dass Ihre Anwendungen den Container stoppen und herunterfahren.
Wenn es sich bei Ihrem Docker-Eingabeskript also um einen Hintergrundprozess wie den folgenden handelt:
Das '&' bewirkt, dass der Container stoppt und beendet wird, wenn später kein anderer Vordergrundprozess ausgelöst wird. Die Lösung besteht also darin, einfach das '&' zu entfernen oder ein anderes CMD im Vordergrund zu verwenden , z
quelle
touch
diese Datei, falls Sie keine Protokolldatei finden konnten.Der Docker-Container wird beendet, wenn die darin enthaltene Aufgabe erledigt ist. Wenn Sie ihn also am Leben erhalten möchten, auch wenn er keinen Job hat oder bereits erledigt ist, können Sie dies tun
docker run -di image
. Nachdem Sie dies getan haben, werdendocker container ls
Sie sehen, wie es läuft.quelle
Vielleicht bin ich es nur, aber unter CentOS 7.3.1611 und Docker 1.12.6 musste ich eine Kombination der Antworten von @VonC & @Christopher Simon verwenden, damit dies zuverlässig funktioniert. Nichts, was ich zuvor getan habe, würde das Beenden des Containers verhindern, nachdem CMD erfolgreich ausgeführt wurde. Ich starte oracle-xe-11Gr2 und sshd.
Dockerfile
Fügen Sie dann -d -t und -i hinzu, um auszuführen
Endlich, nachdem ich stundenlang meinen Kopf gegen die Wand geschlagen hatte
Aus irgendeinem Grund wird das Obige nach dem Ausführen von CMD beendet, wenn das Ende -f entfernt wird oder eine der Optionen -t -d -i weggelassen wird.
quelle
Ich habe es im folgenden Beitrag erklärt, der die gleiche Frage hat.
Wie kann man den Dock Alpin Container behalten, nachdem "Exit" verwendet wurde?
quelle
Ich hatte das gleiche Problem, nur ein anderes Terminal mit einem Schlag darauf zu öffnen, funktionierte für mich:
Container erstellen:
Container starten:
Starten Sie die Bash, um den Container am Laufen zu halten:
Starten Sie den Prozess, den Sie benötigen:
quelle
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 anderen Betriebssystem basiert, das Bash verwenden kann.
Kurz gesagt, das Ende Ihrer Docker-Datei sieht ungefähr so aus.
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.
quelle
Das Ausführen von Docker im interaktiven Modus kann das Problem beheben.
Hier ist das Beispiel für das Ausführen von Bildern mit und ohne interaktiven Modus
chaitra @ RSK-IND-BLR-L06: ~ / Docker $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
BEHÄLTER-ID BILDBEFEHL ERSTELLTE STATUS-PORTS-NAMEN
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
CONTAINER ID IMAGE COMMAND ERSTELLTER STATUS PORTS NAMES c3d6a9529fd7 test_again1.0 "bash" vor 2 Sekunden Up 1 Sekunde awesome_haibt
quelle
Wenn Sie den Container bearbeiten möchten, müssen Sie ihn im Vordergrund ausführen, um ihn am Leben zu erhalten.
quelle
Die Reihenfolge der Argumente ist wichtig
Die Antwort von Jersey Beans (alle 3 Beispiele) hat bei mir funktioniert. Nach einigem Ausprobieren wurde mir klar, dass die Reihenfolge der Argumente wichtig ist.
Lässt den Container im Hintergrund laufen:
docker run -t -d <image-name>
Lässt den Container im Vordergrund laufen:
docker run <image-name> -t -d
Es war mir nicht klar, ob ich einen Powershell-Hintergrund hatte.
quelle