cmd
指令的格式和run
相似,也是兩種格式:
之前介紹容器的時候曾經說過,docker 不是虛擬機器,容器就是程序。既然是程序,那麼在啟動容器的時候,需要指定所執行的程式及引數。cmd
指令就是用於指定預設的容器主程序的啟動命令的。
在執行時可以指定新的命令來替代映象設定中的這個預設命令,比如,ubuntu
映象預設的cmd
是/bin/bash
,如果我們直接docker run -it ubuntu
的話,會直接進入bash
。我們也可以在執行時指定執行別的命令,如docker run -it ubuntu cat /etc/os-release
。這就是用cat /etc/os-release
命令替換了預設的/bin/bash
命令了,輸出了系統版本資訊。
在指令格式上,一般推薦使用exec
格式,這類格式在解析時會被解析為 json 陣列,因此一定要使用雙引號"
,而不要使用單引號。
如果使用shell
格式的話,實際的命令會被包裝為sh -c
的引數的形式進行執行。比如:
cmd echo $home
在實際執行中,會將其變更為:
cmd [ "sh", "-c", "echo $home" ]
這就是為什麼我們可以使用環境變數的原因,因為這些環境變數會被 shell 進行解析處理。
提到cmd
就不得不提容器中應用在前台執行和後台執行的問題。這是初學者常出現的乙個混淆。
docker 不是虛擬機器,容器中的應用都應該以前臺執行,而不是像虛擬機器、物理機裡面那樣,用systemd
去啟動後台服務,容器內沒有後台服務的概念。
一些初學者將cmd
寫為:
cmd service nginx start
然後發現容器執行後就立即退出了。甚至在容器內去使用systemctl
命令結果卻發現根本執行不了。這就是因為沒有搞明白前台、後台的概念,沒有區分容器和虛擬機器的差異,依舊在以傳統虛擬機器的角度去理解容器。
對於容器而言,其啟動程式就是容器應用程序,容器就是為了主程序而存在的,主程序退出,容器就失去了存在的意義,從而退出,其它輔助程序不是它需要關心的東西。
而使用service nginx start
命令,則是希望 upstart 來以後臺守護程序形式啟動nginx
服務。而剛才說了cmd service nginx start
會被理解為cmd [ "sh", "-c", "service nginx start"]
,因此主程序實際上是sh
。那麼當service nginx start
命令結束後,sh
也就結束了,sh
作為主程序退出了,自然就會令容器退出。
正確的做法是直接執行nginx
可執行檔案,並且要求以前臺形式執行。比如:
cmd ["nginx", "-g", "daemon off;"]
CMD命令詳解
一 net use ip ipc user 建立ipc空鏈結 net use ip ipc 密碼 user 使用者名稱 建立ipc非空鏈結 net use h ip c 密碼 user 使用者名稱 直接登陸後對映對方c 到本地為h net use h ip c 登陸後對映對方c 到本地為h net ...
CMD命令詳解 其他
一 cls 清螢幕命令 1功能 清除螢幕上的所有顯示,游標置於螢幕左上角。2型別 內部命令 3格式 cls 二 ver檢視系統版本號命令 1功能 顯示當前系統版本號 2型別 內部命令 3格式 ver 三 data日期設定命令 1功能 設定或顯示系統日期。2型別 內部命令 3格式 date mm dd...
CMD命令詳解 目錄類命令
一 md 建立子目錄 1 功能 建立新的子目錄 2 型別 內部命令 3 格式 md 碟符 路徑名 子目錄名 4 使用說明 1 碟符 指定要建立子目錄的磁碟驅動器字母,若省略,則為當前驅動器 2 路徑名 要建立的子目錄的上級目錄名,若預設則建在當前目錄下。例 1 在c盤的根目錄下建立名為fox的子目錄...