CMD 容器啟動命令

2021-09-05 11:35:34 字數 1719 閱讀 7328

原文:

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...