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指定的所有東東統統作為該可執行程序的后續參數使用。