
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 映像可以指定預設執行某個指令,使用CMD
Dockerfile 中的指令。和:
如果使用者指定參數,
docker run
那麼他們將覆寫 中指定的預設值CMD
。
碰巧,指定的預設命令Ubuntu Dockerfile事實上,是 bash:
CMD ["/bin/bash"]
因此,對於 Ubuntu 映像的具體情況,docker run ... ubuntu /bin/bash
與docker run ... ubuntu
.
當然,這不一定總是正確的。資料庫引擎的 Dockerfile 可以預設執行資料庫指令。在這種情況下,如果您需要互動式 shell,則需要執行docker run ... /bin/bash
.
一般來說,您不能假設這docker run
會給您一個互動式 shell。指定/bin/bash
是否需要 shell 會更安全。
答案2
當您不提供命令(在您的情況下是)時/bin/bash
,在使用-ti
(i
互動式,t
終端)時,您將附加到預設程序,該程序已定義為在使用run
命令時執行DockerFile
。
例如,如果一個鏡像在前台運行一個Web伺服器,那麼在run
不使用 的情況下,您將看到/bin/bash
該網路伺服器的日誌(已執行的預設程式)。
在指定命令時,您告訴我不關心映像上發生了什麼或正在運行什麼,透過執行此「命令」為我提供一個互動終端。
在 Ubuntu 中,預設命令是bash
,如果您不提供,-ti
容器將在運行後立即停止。因為它以非交互模式運行 bash,完成後容器不再執行任何操作。
答案3
嘗試執行以下命令,您可以理解其中的區別
sudo docker run -ti python
sudo docker run -ti python /bin/bash