docker run ubuntu /bin/bash 與 docker run ubuntu

docker run ubuntu /bin/bash 與 docker run ubuntu

Docker 版本 17.06.0-ce

我正在透過觀看影片課程來學習 Docker。

講師展示:

sudo docker run -ti ubuntu /bin/bash

使用 ubuntu 映像運行 docker。而讓我煩惱的是/bin/bash\man docker run表明這/bin/bash是一個命令。那是docker run IMAGE [COMMAND]。嗯,沒關係。但有什麼區別

sudo docker run -ti ubuntu 

sudo docker run -ti ubuntu /bin/bash

對我來說沒有。而講師並沒有將注意力集中在命令上。他說我們只是跑docker。這是他在課程中的第一個命令。然後他表明我們已經與主機隔離了,我們可以自由地破壞我們想要的東西而不會造成任何損壞(例如 rm -rf /bin)。

我檢查了:

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


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

好吧,對我自己來說,我決定把這/bin/bash部分當作垃圾丟掉。

但無論如何我決定問你:也許這兩種運行 Docker 的方式之間存在一些差異?如果有,那是什麼樣的?

答案1

Docker 映像可以指定預設執行某個指令,使用CMDDockerfile 中的指令。和:

如果使用者指定參數,docker run那麼他們將覆寫 中指定的預設值CMD

碰巧,指定的預設命令Ubuntu Dockerfile事實上,是 bash:

CMD ["/bin/bash"]

因此,對於 Ubuntu 映像的具體情況,docker run ... ubuntu /bin/bashdocker run ... ubuntu.

當然,這不一定總是正確的。資料庫引擎的 Dockerfile 可以預設執行資料庫指令。在這種情況下,如果您需要互動式 shell,則需要執行docker run ... /bin/bash.

一般來說,您不能假設這docker run會給您一個互動式 shell。指定/bin/bash是否需要 shell 會更安全。

答案2

當您不提供命令(在您的情況下是)時/bin/bash,在使用-tii互動式,t終端)時,您將附加到預設程序,該程序已定義為在使用run命令時執行DockerFile

例如,如果一個鏡像在前台運行一個Web伺服器,那麼在run不使用 的情況下,您將看到/bin/bash該網路伺服器的日誌(已執行的預設程式)。

在指定命令時,您告訴我不關心映像上發生了什麼或正在運行什麼,透過執行此「命令」為我提供一個互動終端。

在 Ubuntu 中,預設命令是bash,如果您不提供,-ti容器將在運行後立即停止。因為它以非交互模式運行 bash,完成後容器不再執行任何操作。

答案3

嘗試執行以下命令,您可以理解其中的區別

sudo docker run -ti python
sudo docker run -ti python /bin/bash

相關內容