Docker隨筆記—docker run執行後,容器的狀態是Exited的一些困惑

問題:運行docker run -itd -p 5000:5000 --name localregistry registry:2.5 /bin/bash命令後,發現容器並無跑起來,而是變成了Exited狀態。若是將末尾的/bin/bash去掉,容器就能正常的start了python

解決:
翻看很多docker資料, 到目前爲止,對致使此問題的出現算是有了一個比較清晰的認識。
1.容器的生命週期。要把docer容器看作是一個單獨的進程及運行環境。容器不等價於一個虛擬的操做系統。Docker的開發人員也一直主張doder容器應該只運行一個進程。例如,一個web server服務就是一個進程。docker run命令就是爲了運行一個進程。當一個進程結束了,那麼docker容器也就結束了。web

2.根據問題中描述的現象,兩條命令的差異就在與末尾是否添加了/bin/bash這條command。暫且先停住。咱們回過頭來看docker image是怎麼生成的。docker

3.Dockerfile文件。Dockerfile文件中有兩個關鍵字CMDENTRYPOINT。其中CMD的值是能夠被覆蓋的。舉個栗子:
假設Dockerfile中的內容包含了:bash

FROM python
CMD ["/home/hello.sh","Hello World"]   
ENTRYPOINT ["/home/hello.sh","xiaoming"]

那麼根據CMD可被覆蓋的特徵來看,若是在docker run後增長了/bin/bash。那麼,在鏡像run的時候,執行的CMD就變成了/bin/bash。通常鏡像文件中兩種關鍵字選用其中之一就能夠了。但也能夠同時使用。同時使用的時候,CMD中的值會被看成ENTRYPOINT的參數。因此,ENTRYPOINT的內容就變成["/home/hello.sh","/bin/bash"]spa

4.咱們再來看我要啓動的registry鏡像中都包含了哪些CMD和ENTRYPOINT。以下圖:
圖片描述操作系統

根據上圖中的前兩行可知,容器運行後默認執行的是/entrypoint.sh腳本,腳本命令的參數是/etc/docker/regis...。因此,若是咱們本身在run的時候添加了新的command,那麼鏡像內置的執行命令就沒法正確執行了,因而容器就Exited了。code

最後,準備附上參考資料連接。但因爲此文章是跨天寫的,有些資料找不到了。你們上網查查CMD與ENTRYPOINT區別的資料的就明白了。server

相關文章
相關標籤/搜索