參考:https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/
創建 Pod 時設置命令及參數
創建 Pod 時,可以為其下的容器設置啟動時要執行的命令及其參數。如果要設置命令,就填寫在配置文件的 command 字段下,如果要設置命令的參數,就填寫在配置文件的 args 字段下。一旦 Pod 創建完成,該命令及其參數就無法再進行更改了。
如果在配置文件中設置了容器啟動時要執行的命令及其參數,那么容器鏡像中自帶的命令與參數將會被覆蓋而不再執行。如果配置文件中只是設置了參數,卻沒有設置其對應的命令,那么容器鏡像中自帶的命令會使用該新參數作為其執行時的參數。
說明: 在有些容器運行時中,command 字段對應 entrypoint,請參閱下面的 說明事項。
本示例中,將創建一個只包含單個容器的 Pod。在 Pod 配置文件中設置了一個命令與兩個參數:
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
使用環境變量來設置參數
在上面的示例中,我們直接將一串字符作為命令的參數。除此之外,我們還可以將環境變量作為命令的參數。
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
這意味着你可以將那些用來設置環境變量的方法應用於設置命令的參數,其中包括了 ConfigMaps 與 Secrets。
說明: 環境變量需要加上括號,類似於 "$(VAR)"。這是在 command 或 args 字段使用變量的格式要求。
在 Shell 來執行命令
有時候,你需要在 Shell 腳本中運行命令。 例如,你要執行的命令可能由多個命令組合而成,或者它就是一個 Shell 腳本。 這時,就可以通過如下方式在 Shell 中執行命令:
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
說明事項
下表給出了 Docker 與 Kubernetes 中對應的字段名稱。
如果要覆蓋默認的 Entrypoint 與 Cmd,需要遵循如下規則:
如果在容器配置中沒有設置 command 或者 args,那么將使用 Docker 鏡像自帶的命令及其參數。
如果在容器配置中只設置了 command 但是沒有設置 args,那么容器啟動時只會執行該命令, Docker 鏡像中自帶的命令及其參數會被忽略。
如果在容器配置中只設置了 args,那么 Docker 鏡像中自帶的命令會使用該新參數作為其執行時的參數。
如果在容器配置中同時設置了 command 與 args,那么 Docker 鏡像中自帶的命令及其參數會被忽略。 容器啟動時只會執行配置中設置的命令,並使用配置中設置的參數作為命令的參數。
下面是一些例子: