Docker Run Ubuntu / Bin / Bash vs Docker Run Ubuntu

15

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 image ubuntu aus. Und was mich stört, ist /bin/bash\. man docker runzeigt, dass /bin/bashdas ein Befehl ist. Das ist docker run IMAGE [COMMAND]. Nun, es ist in Ordnung. Aber was ist der Unterschied zwischen

sudo docker run -ti ubuntu 

und

sudo docker run -ti ubuntu /bin/bash

Für mich gibt es keine. Und der Dozent konzentriert sich nicht auf das Kommando. Er sagte, dass wir nur Hafenarbeiter sind. Es war sein erstes Kommando im Kurs. Und dann zeigt er, dass wir von der Host-Maschine isoliert wurden, wir können frei ruinieren, was wir wollen, ohne Schaden zu nehmen (wie z. B. 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, für mich selbst habe ich beschlossen, diesen /bin/bashTeil als Müll wegzuwerfen .

Aber trotzdem habe ich mich entschlossen, Sie zu fragen: Vielleicht gibt es einen Unterschied zwischen den beiden Möglichkeiten, Docker auszuführen? Wenn ja, wie ist es?

Michael
quelle

Antworten:

10

Docker-Images können mithilfe der CMDDirektive in der Docker-Datei angeben, dass ein bestimmter Befehl standardmäßig ausgeführt werden soll . Und:

Wenn der Benutzer Argumente für angibt, docker runüberschreibt er die in angegebene Standardeinstellung CMD.

Der Standardbefehl für die Ubuntu-Docker-Datei lautet tatsächlich bash:

CMD ["/bin/bash"]

Also, für den speziellen Fall des Ubuntu-Images, docker run ... ubuntu /bin/bashist nicht anders als docker run ... ubuntu.

Natürlich muss das nicht immer so sein. Eine Docker-Datei für ein Datenbankmodul führt möglicherweise standardmäßig den Datenbankbefehl aus. Wenn Sie in diesem Fall eine interaktive Shell benötigen, müssen Sie dies tun docker run ... /bin/bash.

Im Allgemeinen können Sie nicht davon ausgehen, docker rundass Sie eine interaktive Shell erhalten. Es ist sicherer anzugeben, /bin/bashob Sie eine Shell benötigen.

muru
quelle
2

Wenn Sie den Befehl nicht angeben, was in Ihrem Fall /bin/bashbei Verwendung von -ti( iinteraktivem) tTerminal der Fall ist , werden Sie an das Standardprogramm angehängt, das für die Ausführung bei Verwendung von runBefehl in definiert wurde DockerFile.

Wenn beispielsweise ein Bild mit einem Web - Server auf dem Vordergrund ausgeführt wird , was Sie nach der Verwendung sehen werden , runohne dass das /bin/bashist die Protokolle dieses Web - Server (Standard - Programms , das ausgeführt wurde).

Während Sie den Befehl spezifizieren, sagen Sie, dass es mir egal ist, was auf dem Bild vor sich geht oder läuft. Geben Sie mir ein interaktives Terminal, indem Sie diesen "Befehl" ausführen.

In Ubuntu ist der Standardbefehl bashund wenn Sie nicht angeben, wird -tider Container sofort nach dem Ausführen gestoppt. weil die Bash im nicht interaktiven Modus ausgeführt wurde und der Container danach nichts mehr zu tun hat.

Ravexina
quelle