Docker führt Ubuntu aus /bin/bash vs. Docker führt Ubuntu aus

Docker führt Ubuntu aus /bin/bash vs. Docker führt Ubuntu aus

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 runzeigt, dass es /bin/bashsich 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/bashTeil 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 CMDDirektive im Dockerfile. Und:

Wenn der Benutzer Argumente angibt, docker runüberschreiben diese die in angegebenen Standardwerte CMD.

Der Standardbefehl fürdas Ubuntu Dockerfileist in der Tat Bash:

CMD ["/bin/bash"]

Im speziellen Fall des Ubuntu-Images docker run ... ubuntu /bin/bashbesteht 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 runSie dadurch eine interaktive Shell erhalten. Es ist sicherer, anzugeben, /bin/bashob Sie eine Shell benötigen.

Antwort2

/bin/bashWenn Sie den Befehl bei der Verwendung von -ti( iinteraktiv, Terminal) nicht angeben (in Ihrem Fall ) , twerden Sie an das Standardprogramm angeschlossen, das so definiert ist, dass es bei Verwendung rundes Befehls in ausgeführt wird DockerFile.

Wenn beispielsweise ein Bild einen Webserver im Vordergrund ausführt, sehen Sie nach der Verwendung runohne /bin/bashdie 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: bashWenn Sie ihn nicht angeben, -tiwird 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

verwandte Informationen