k8s中的command和docker的entrypoint區別


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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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