Dockerfile 中的 CMD和ENTRYPOINT 兩兄弟


CMD

先說老大 CMD

當一個容器准備好運行之后,需要找一個指定命令來創建一個初始進程並運行。

一,/bin/sh -c

因為某種意義上一個Dockerfile其實可以理解是一個簡化版bash 腳本,所以一般情況下,我們可以像寫bash命令一樣使用CMD來指定使用bash來運行命令。

比如:

CMD echo 'hello world!'

這樣,容器創建之后,就會使用/bin/sh -c來運行上述命令,如下所示:

/bin/sh -c 'echo hello world!'

 

二, 直接運行可執行程序

如果我們不想是用/bin/sh而是直接運行一個可執行程序的話,怎么辦呢?這種情況下,可以使用CMD命令的另外一種形式,如下:

CMD ["echo", "hello world!"]

這樣,容器准備好以后就會直接創建一個進程來運行echo這個程序 (/bin/echo),打印出"hello world!"。

 

使用CMD有一個好處就是在使用docker run命令運行容器時可以使用command參數來覆蓋CMD缺省指定的命令。比如:

docker run -it test:latest echo 'hello world!'

 

ENTRYPOINT

其實ENTRYPOINT是老大,它比CMD優先級更高

我們也可以使用ENTRYPOINT來指定容器初始程序,可以是bash /bin/sh, 也可以是其他可執行程序。語法和CMD的相似。比如:

#/bin/sh -c ENTRYPOINT echo 'hello world!' #exeutable ENTRYPOINT ["echo", "hello world!"] 

 

兩兄弟如何相處

一 EntryPoint 老大

CMD可以指定容器運行入口。但ENTRYPOINT作為entry point,有不可置疑的地位。它是老大,只有它不在的時候,CMD才能當老大。那么它在的時候CMD是什么地位呢?這要看它以什么方式存在,如果是使用/bin/sh -c來啟動容器,那么沒有CMD什么事了。如果是使用其他可執行程序啟動容器,那么CMD指定的所有東東統統作為該可執行程序的后續參數使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM