原文:
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 不是虛擬機器,容器中的應用都應該以前臺執行,而不是像虛擬機器、物理機裡面那樣,用 upstart/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命令啟動服務
成功安裝oracle 11g後,共有7個服務,一 這七個服務的含義分別為 1.oracle orcl vss writer service oracle卷對映拷貝寫入服務,vss volume shadow copy service 能夠讓儲存基礎裝置 比如磁碟,陣列等 建立高保真的時間點映像,即對...
無法在cmd命令介面啟動Tomcat
1.我先是進入到cmd介面,輸入startup命令回車,提示startup不是內部或外部命令,tomcat啟動失敗 2.緊接著我又進入了tomcat的安裝目錄下的bin目錄下啟動cmd介面輸入startup.bat命令回車,提示startup.bat不是內部或外部命令,tomcat啟動失敗 此時我發...
CMD命令 修改啟動項 bcdedit
microsoft windows 版本 10.0.17763.1217 c 2018 microsoft corporation。保留所有權利。c windows system32 bcdedit v store p boot bcd windows 啟動管理器 識別符號 device parti...