通過k8s的command和args配置Docker入口命令
阿新 • • 發佈:2019-02-18
首先來說說dockerfile中的ENTRYPOINT,官方是這麼解釋的:
An ENTRYPOINT allows you to configure a container that will run as an executable.
即它可以讓你的容器功能表現得像一個可執行程式一樣,當容器被建立後,這條命令就會被執行。一般的ENTRYPOINT的格式是:
ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)
ENTRYPOINT command param1 param2 (shell form)
總之就是一個命令帶上若干個引數,這是Docker的用法。
入口命令給容器建立帶來了一些靈活性,如果在k8s中想要覆蓋DockerFile中的入口命令,自己重新定義入口命令是否可以呢?答案是肯定的,看下面一段.yaml檔案:
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"]
這是一個建立Pod的配置,在containers
節點下,有如下兩行
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
這裡,從字面意思不難看出,這兩行可以實現覆蓋DockerFile中的ENTRYPOINT功能。具體的command
代表ENTRYPOINT的命令列,而args
代表具體引數。
當用戶同時寫了command
和args
的時候自然是可以覆蓋DockerFile中ENTRYPOINT的命令列和引數,那麼對於具體情況呢,比如僅僅寫了command
args
的時候呢?完整的情況分類如下:
- 如果
command
和args
均沒有寫,那麼用Docker預設的配置。 - 如果
command
寫了,但args
沒有寫,那麼Docker預設的配置會被忽略而且僅僅執行.yaml檔案的command
(不帶任何引數的)。 - 如果
command
沒寫,但args
寫了,那麼Docker預設配置的ENTRYPOINT的命令列會被執行,但是呼叫的引數是.yaml中的args
。 - 如果如果
command
和args
都寫了,那麼Docker預設的配置被忽略,使用.yaml的配置。