創建 Pod 時設置命令及參數
創建 Pod 時,可以為其下的容器設置啟動時要執行的命令及其參數。如果要設置命令,就填寫在配置文件的 command
字段下,如果要設置命令的參數,就填寫在配置文件的 args
字段下。一旦 Pod 創建完成,該命令及其參數就無法再進行更改了。
如果在配置文件中設置了容器啟動時要執行的命令及其參數,那么容器鏡像中自帶的命令與參數將會被覆蓋而不再執行。如果配置文件中只是設置了參數,卻沒有設置其對應的命令,那么容器鏡像中自帶的命令會使用該新參數作為其執行時的參數。
本示例中,將創建一個只包含單個容器的 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
-
基於 YAML 文件創建一個 Pod:
kubectl apply -f https://k8s.io/examples/pods/commands.yaml
-
獲取正在運行的 Pods:
kubectl get pods
查詢結果顯示在 command-demo 這個 Pod 下運行的容器已經啟動完成。
-
如果要獲取容器啟動時執行命令的輸出結果,可以通過 Pod 的日志進行查看:
kubectl logs command-demo
日志中顯示了 HOSTNAME 與 KUBERNETES_PORT 這兩個環境變量的值:
command-demo tcp://10.3.240.1:443
使用環境變量來設置參數
在上面的示例中,我們直接將一串字符作為命令的參數。除此之外,我們還可以將環境變量作為命令的參數。
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 中對應的字段名稱。
描述 | Docker 字段名稱 | Kubernetes 字段名稱 |
---|---|---|
容器執行的命令 | Entrypoint | command |
傳給命令的參數 | Cmd | args |
如果要覆蓋默認的 Entrypoint 與 Cmd,需要遵循如下規則:
-
如果在容器配置中沒有設置
command
或者args
,那么將使用 Docker 鏡像自帶的命令及其參數。 -
如果在容器配置中只設置了
command
但是沒有設置args
,那么容器啟動時只會執行該命令, Docker 鏡像中自帶的命令及其參數會被忽略。 -
如果在容器配置中只設置了
args
,那么 Docker 鏡像中自帶的命令會使用該新參數作為其執行時的參數。 -
如果在容器配置中同時設置了
command
與args
,那么 Docker 鏡像中自帶的命令及其參數會被忽略。 容器啟動時只會執行配置中設置的命令,並使用配置中設置的參數作為命令的參數。
下面是一些例子:
鏡像 Entrypoint | 鏡像 Cmd | 容器 command | 容器 args | 命令執行 |
---|---|---|---|---|
[/ep-1] |
[foo bar] |
<not set> | <not set> | [ep-1 foo bar] |
[/ep-1] |
[foo bar] |
[/ep-2] |
<not set> | [ep-2] |
[/ep-1] |
[foo bar] |
<not set> | [zoo boo] |
[ep-1 zoo boo] |
[/ep-1] |
[foo bar] |
[/ep-2] |
[zoo boo] |
[ep-2 zoo boo] |