摘要:如果在 Pod 配置中只設置了 command 但是沒有設置 args ,那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其參數會被忽略。如果在 Pod 配置中沒有設置 command 或者 args ,那麼將使用 Docker 鏡像自帶的命令及其參數。

創建 Pod 時,可以爲其下的容器設置啓動時要執行的命令及其參數。如果要設置命令,就填寫在配置文件的 command 字段下,如果要設置命令的參數,就填寫在配置文件的 args 字段下。一旦 Pod 創建完成,該命令及其參數就無法再進行更改了。

啓動優先級

下表給出了 Docker 與 Kubernetes 中對應的字段名稱:

描述 Docker字段名稱 Kubernetes字段名稱
容器執行的命令 Entrypoint command
傳給命令的參數 Cmd args

如果要覆蓋Docker容器默認的 EntrypointCmd ,需要遵循如下規則:

  • 如果在 Pod 配置中沒有設置 command 或者 args ,那麼將使用 Docker 鏡像自帶的命令及其參數。
  • 如果在 Pod 配置中只設置了 command 但是沒有設置 args ,那麼容器啓動時只會執行該命令,Docker 鏡像中自帶的命令及其參數會被忽略。
  • 如果在 Pod 配置中只設置了 args ,那麼 Docker 鏡像中自帶的命令會使用該新參數作爲其執行時的參數。
  • 如果在 Pod 配置中同時設置了 commandargs ,那麼 Docker 鏡像中自帶的命令及其參數會被忽略。容器啓動時只會執行配置中設置的命令,並使用配置中設置的參數作爲命令的參數。

例子

Pod 啓動例子:

使用 commandargs 示例:

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 中也可以使用 ConfigMapsSecrets 來做爲變量傳入。

通過 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"]

EntrypointCmd 組合使用:

FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping", "-c", "10"]
CMD ["localhost"]
相關文章