1. 程式人生 > >通過k8s的command和args配置Docker入口命令

通過k8s的command和args配置Docker入口命令

 首先來說說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代表具體引數。
 當用戶同時寫了commandargs的時候自然是可以覆蓋DockerFile中ENTRYPOINT的命令列和引數,那麼對於具體情況呢,比如僅僅寫了command

或者args的時候呢?完整的情況分類如下:

  • 如果commandargs均沒有寫,那麼用Docker預設的配置。
  • 如果command寫了,但args沒有寫,那麼Docker預設的配置會被忽略而且僅僅執行.yaml檔案的command(不帶任何引數的)。
  • 如果command沒寫,但args寫了,那麼Docker預設配置的ENTRYPOINT的命令列會被執行,但是呼叫的引數是.yaml中的args
  • 如果如果commandargs都寫了,那麼Docker預設的配置被忽略,使用.yaml的配置。