docker run ubuntu / bin / bash vs docker run ubuntu

15

Wersja Docker 17.06.0-ce

Studiuję Docker, oglądając kurs wideo.

Wykładowca pokazuje:

sudo docker run -ti ubuntu /bin/bash

Uruchom okno dokowane z obrazem ubuntu. I co mnie niepokoi /bin/bash\. man docker runpokazuje, że /bin/bashjest to polecenie. Że jest docker run IMAGE [COMMAND]. W porządku. Ale jaka jest różnica między

sudo docker run -ti ubuntu 

i

sudo docker run -ti ubuntu /bin/bash

Dla mnie nie ma. A wykładowca nie skupia uwagi na poleceniu. Powiedział, że po prostu prowadzimy dokera. To było jego pierwsze polecenie w trakcie. A potem pokazuje, że zostaliśmy odizolowani od komputera-hosta, możemy swobodnie zniszczyć to, czego chcemy, bez żadnych uszkodzeń (np. Rm -rf / bin).

Sprawdziłem:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash

Cóż, dla siebie postanowiłem wyrzucić tę /bin/bashczęść jako śmieci.

Ale tak czy inaczej postanowiłem cię zapytać: może jest jakaś różnica między dwoma sposobami uruchamiania Dockera? Jeśli tak, to jak to jest?

Michael
źródło

Odpowiedzi:

11

Obrazy Dockera mogą określać, że określone polecenie ma być uruchamiane domyślnie, korzystając z CMDdyrektywy w Dockerfile . I:

Jeśli użytkownik docker runpoda argumenty, wówczas zastąpi domyślną określoną w CMD.

Tak się składa, że ​​domyślnym poleceniem określonym dla Ubocku Dockerfile jest w rzeczywistości bash:

CMD ["/bin/bash"]

Tak więc w konkretnym przypadku obrazu Ubuntu docker run ... ubuntu /bin/bashnie różni się on od docker run ... ubuntu.

Oczywiście nie zawsze musi tak być. Plik Docker dla silnika bazy danych może domyślnie uruchamiać polecenie bazy danych. W takim przypadku, jeśli potrzebujesz interaktywnej powłoki, musisz to zrobić docker run ... /bin/bash.

Ogólnie nie możesz założyć, że docker runda ci interaktywną powłokę. Bezpieczniej jest określić, /bin/bashczy potrzebujesz powłoki.

muru
źródło
2

Jeśli nie podasz polecenia, które w twoim przypadku jest /bin/bashpodczas korzystania -ti( iinteraktywny, tterminal), zostaniesz dołączony do domyślnego programu, który został zdefiniowany jako wykonywany podczas używania runpolecenia w DockerFile.

Na przykład, jeśli obraz uruchamia serwer WWW na pierwszym planie, po użyciu runbez zobaczysz /bin/bashdzienniki tego serwera WWW (domyślny program, który został uruchomiony).

Podając polecenie, mówisz, że nie dbam o to, co się dzieje lub działa na obrazie, daj mi interaktywny terminal, uruchamiając to „polecenie”.

W Ubuntu domyślnym poleceniem jest, basha jeśli nie podasz, -tikontener zostanie zatrzymany zaraz po uruchomieniu. ponieważ uruchomił bash w trybie nieinteraktywnym, a po jego zakończeniu kontener nie ma już nic do roboty.

Ravexina
źródło