
Docker-Version 17.06.0-ce
Ich lerne Docker, indem ich mir einen Videokurs anschaue.
Der Dozent zeigt:
sudo docker run -ti ubuntu /bin/bash
Führen Sie Docker mit dem Ubuntu-Image aus. Und was mich beunruhigt, ist /bin/bash\
.
man docker run
zeigt, dass es /bin/bash
sich um einen Befehl handelt. Das ist docker run IMAGE [COMMAND]
. Nun, es ist ok. Aber was ist der Unterschied zwischen
sudo docker run -ti ubuntu
Und
sudo docker run -ti ubuntu /bin/bash
Für mich gibt es keinen. Und der Dozent konzentriert sich nicht auf den Befehl. Er sagte, wir führen einfach Docker aus. Das war sein erster Befehl im Kurs. Und dann zeigt er, dass wir vom Host-Rechner isoliert wurden und frei und ohne Schaden ruinieren können, was wir wollen (wie rm -rf /bin).
Ich überprüfte:
$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash
$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash
Nun, ich persönlich habe beschlossen, diesen /bin/bash
Teil als Müll wegzuwerfen.
Trotzdem habe ich mich entschlossen, Sie zu fragen: Gibt es vielleicht einen Unterschied zwischen den beiden Möglichkeiten, Docker auszuführen? Und wenn ja, wie sieht dieser aus?
Antwort1
Docker-Images können angeben, dass ein bestimmter Befehl standardmäßig ausgeführt werden soll, indemdie CMD
Direktive im Dockerfile. Und:
Wenn der Benutzer Argumente angibt,
docker run
überschreiben diese die in angegebenen StandardwerteCMD
.
Der Standardbefehl fürdas Ubuntu Dockerfileist in der Tat Bash:
CMD ["/bin/bash"]
Im speziellen Fall des Ubuntu-Images docker run ... ubuntu /bin/bash
besteht also kein Unterschied docker run ... ubuntu
.
Natürlich muss das nicht immer der Fall sein. Ein Dockerfile für eine Datenbank-Engine kann den Datenbankbefehl standardmäßig ausführen. In diesem Fall müssen Sie Folgendes tun, wenn Sie eine interaktive Shell benötigen docker run ... /bin/bash
.
Im Allgemeinen können Sie nicht davon ausgehen, dass docker run
Sie dadurch eine interaktive Shell erhalten. Es ist sicherer, anzugeben, /bin/bash
ob Sie eine Shell benötigen.
Antwort2
/bin/bash
Wenn Sie den Befehl bei der Verwendung von -ti
( i
interaktiv, Terminal) nicht angeben (in Ihrem Fall ) , t
werden Sie an das Standardprogramm angeschlossen, das so definiert ist, dass es bei Verwendung run
des Befehls in ausgeführt wird DockerFile
.
Wenn beispielsweise ein Bild einen Webserver im Vordergrund ausführt, sehen Sie nach der Verwendung run
ohne /bin/bash
die Protokolle dieses Webservers (Standardprogramm, das ausgeführt wurde).
Indem Sie den Befehl angeben, teilen Sie mir mit, dass es mir egal ist, was auf dem Image passiert oder ausgeführt wird. Geben Sie mir durch Ausführen dieses „Befehls“ ein interaktives Terminal.
In Ubuntu lautet der Standardbefehl: bash
Wenn Sie ihn nicht angeben, -ti
wird der Container direkt nach der Ausführung gestoppt, da die Bash im nicht-interaktiven Modus ausgeführt wurde und der Container nach Abschluss nichts mehr zu tun hat.
Antwort3
Versuchen Sie, den folgenden Befehl auszuführen, und Sie werden den Unterschied erkennen
sudo docker run -ti python
sudo docker run -ti python /bin/bash