K8s Pod Command 與容器鏡像 Cmd 啓動優先級詳解
摘要:如果在 Pod 配置中只設置了 command 但是沒有設置 args ,那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其參數會被忽略。如果在 Pod 配置中沒有設置 command 或者 args ,那麼將使用 Docker 鏡像自帶的命令及其參數。
創建 Pod 時,可以爲其下的容器設置啓動時要執行的命令及其參數。如果要設置命令,就填寫在配置文件的 command
字段下,如果要設置命令的參數,就填寫在配置文件的 args
字段下。一旦 Pod 創建完成,該命令及其參數就無法再進行更改了。
啓動優先級
下表給出了 Docker 與 Kubernetes 中對應的字段名稱:
描述 | Docker字段名稱 | Kubernetes字段名稱 |
---|---|---|
容器執行的命令 | Entrypoint | command |
傳給命令的參數 | Cmd | args |
如果要覆蓋Docker容器默認的 Entrypoint
與 Cmd
,需要遵循如下規則:
-
如果在 Pod 配置中沒有設置
command
或者args
,那麼將使用 Docker 鏡像自帶的命令及其參數。 -
如果在 Pod 配置中只設置了
command
但是沒有設置args
,那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其參數會被忽略。 -
如果在 Pod 配置中只設置了
args
,那麼 Docker 鏡像中自帶的命令會使用該新參數作爲其執行時的參數。 -
如果在 Pod 配置中同時設置了
command
與args
,那麼 Docker 鏡像中自帶的命令及其參數會被忽略。容器啓動時只會執行配置中設置的命令,並使用配置中設置的參數作爲命令的參數。
例子
Pod
啓動例子:
使用 command
和 args
示例:
apiVersion: v1 kind: Pod metadata: name: demo labels: purpose: demo spec: containers: - name: demo-container image: debian command: ["printenv"] args: ["HOSTNAME", "KUBERNETES_PORT"] restartPolicy: OnFailure
使用 環境變量
來設置參數:
env: - name: MESSAGE value: "hello world" command: ["/bin/echo"] args: ["$(MESSAGE)"]
上面例子使用 env
來聲明環境變量,但 k8s 中也可以使用 ConfigMaps
與 Secrets
來做爲變量傳入。
通過 shell
命令來執行:
command: ["/bin/bash"] args: ["-c", "while true; do echo "Hello World"; sleep 10;done"]
Docker 鏡像啓動例子
Cmd
單獨使用:
FROM ubuntu:trusty CMD ["echo", "Hello World"]
Entrypoint
單獨使用:
FROM ubuntu:trusty ENV name John ENTRYPOINT ["echo", "Hello, $name"]
Entrypoint
和 Cmd
組合使用:
FROM ubuntu:trusty ENTRYPOINT ["/bin/ping", "-c", "10"] CMD ["localhost"]