Docker Entrypoint & Cmd
先回顧下CMD指令的含義,CMD指令可以指定容器啟動時要執行的命令,但它可以被docker run命令的參數覆蓋掉。
ENTRYPOINT 指令和CMD類似,它也可用戶指定容器啟動時要執行的命令,但如果dockerfile中也有CMD指令,CMD中的參數會被附加到ENTRYPOINT 指令的后面。 如果這時docker run命令帶了參數,這個參數會覆蓋掉CMD指令的參數,並也會附加到ENTRYPOINT 指令的后面。這樣當容器啟動后,會執行ENTRYPOINT 指令的參數部分。
可以看出,相對來說ENTRYPOINT指令優先級更高。我們來看個例子,下面是Dockerfile的內容:
### test
FROM ubuntu
MAINTAINER hello
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
ENTRYPOINT ["echo"]
CMD ["defaultvalue"]
假設通過該Dockerfile構建的鏡像名為 myimage。
當運行 docker run myimage 輸出的內容是 defaultvalue,可以看出CMD指令的參數得確是被添加到ENTRYPOINT指令的后面,然后被執行。
當運行docker run myimage hello world 輸出的內容是 hello world ,可以看出docker run命令的參數得確是被添加到ENTRYPOINT指令的后面,然后被執行,這時CMD指令被覆蓋了。
另外我們可以在docker run命令中通過 --entrypoint 覆蓋dockerfile文件中的ENTRYPOINT設置,如:
docker run --entrypoint="echo" myimage good 結果輸出good
注意,不管是哪種方式,創建容器后,通過 docker ps --no-trunc查看容器信息時,COMMAND列會顯示最終生效的啟動命令。
此外,很多的數據庫軟件的docker鏡像,一般在entrypoint的位置會設置一個docker-entrypoint.sh文件,此文件位於/usr/local/bin位置,用於在容器初次啟動的時候進行數據庫的初始化操作。
Kubernetes Command & args
下表總結了Docker和Kubernetes使用的字段名稱:
當你覆蓋默認的Entrypoint和Cmd時,將應用以下規則:
如果不為容器提供command或args參數,則使用Docker鏡像中定義的默認值。
如果提供command但沒有提供args參數,則僅使用提供的command。Docker鏡像中定義的默認EntryPoint和默認Cmd將被忽略。
如果僅為容器提供args,則Docker鏡像中定義的默認Entrypoint將與您提供的args一起運行。
如果提供command和args,則將忽略Docker鏡像中定義的默認Entrypoint和默認Cmd。 您的command與 args一起運行。
可以看到,k8s利用了Dockerfile的覆蓋機制,使用command和args參數有選擇性的覆蓋了Docker鏡像中的Entrypoint和Cmd啟動參數,下面是一些例子:
使用command和args的例子:
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
參考資料:
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
作者:暴走的初號機
鏈接:http://events.jianshu.io/p/23350af92768
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。