問題:運行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文件中有兩個關鍵字CMD
和ENTRYPOINT
。其中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