-
ENTRYPOINT和CMD都是讓用戶指定一個(gè)可執(zhí)行程序- 這個(gè)可執(zhí)行程序在
container啟動(dòng)后自動(dòng)啟動(dòng).
- 這個(gè)可執(zhí)行程序在
-
如果你想讓自己制作的鏡像自動(dòng)運(yùn)行程序(不需要在docker run后面添加命令行指定運(yùn)行的命令) , 則必須在
Dockerfile里面, 使用ENTRYPOINT或者CMD命令- 否則執(zhí)行運(yùn)行一個(gè)沒有調(diào)用
ENTRYPOINT或者CMD的docker鏡像, 一定返回錯(cuò)誤
- 否則執(zhí)行運(yùn)行一個(gè)沒有調(diào)用
規(guī)則
覆蓋
在寫
Dockerfile時(shí),ENTRYPOINT或者CMD命令會(huì)自動(dòng)覆蓋之前的ENTRYPOINT或者CMD命令.-
我們也可以在命令行啟動(dòng)
docker鏡像時(shí), 執(zhí)行其他命令行參數(shù), 覆蓋默認(rèn)的CMD- 如下,覆蓋命令為
hostnamedocker run demo hostname
- 如下,覆蓋命令為
-
和
CMD類似, 默認(rèn)的ENTRYPOINT在docker run時(shí)也可以被覆蓋.- 在運(yùn)行時(shí), 用
--entrypoint覆蓋默認(rèn)的ENTRYPOINTdocker run --entrypoint
- 在運(yùn)行時(shí), 用
區(qū)別
- 可見,用戶在執(zhí)行
docker run的時(shí)候,CMD的默認(rèn)程序比ENTRYPOINT更容易被覆蓋
寫法(Shell vs. Exec)
-
ENTRYPOINT和CMD指令都支持2種不同的寫法:-
shell表示法和exec表示法
-
下面的例子使用了shell表示法:
CMD executable param1 param2
當(dāng)使用
shell表示法時(shí),命令行程序作為sh程序的子程序運(yùn)行(docker用/bin/sh -c的語(yǔ)法調(diào)用命令行程序)如果我們用
docker ps命令查看運(yùn)行的docker, 就可以看出實(shí)際運(yùn)行的是/bin/sh -c命令-
雖然
shell表示法看起來可以順利工作, 但是它其實(shí)上有一些小問題存在.- 由于
/bin/sh命令不會(huì)轉(zhuǎn)發(fā)消息給實(shí)際運(yùn)行的子程序命令, 所以不能安全得關(guān)閉docker容器 - 如果鏡像沒有
shell程序,使用shell的表示法會(huì)導(dǎo)致docker容器不能運(yùn)行.
- 由于
exec表示法:
CMD ["executable","param1","param2"]
- 它沒有
shell的表示法的缺點(diǎn)
ENTRYPOINT 和 CMD 組合使用
在某種情況下, 組合
ENTRYPOINT和CMD能發(fā)揮更大的作用-
ENTRYPOINT指定默認(rèn)的運(yùn)行命令,CMD指定默認(rèn)的運(yùn)行參數(shù).-
ENTRYPOINT和CMD同時(shí)存在時(shí),docker會(huì)把CMD的命令拼接到ENTRYPOINT命令之后
-
例子
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]
- 這里
docker最終運(yùn)行的命令是:ping -c 3 localhost