Pages - Menu

2022年8月17日 星期三

[k8s] k8s中的command與dockerfile的 CMD

前言

忘記是什麼原因,
讓我跑去查這兩個的差異😂

正文

dockerfile中的指令

CMD 、 ENTRYPOINT

k8s 中的yaml 中也有

command 、args

先來分辨 CMD 與 ENTRYPOINT的差別

CMD

先上個Dockerfile

FROM golang:1.16-alpine AS build-env

CMD ["/bin/sh","-c","echo $HOME"]

這個build完後,直接執行會顯示 /root,如果用

docker run golang:1.16 /bin/sh -c "echo $SHELL"

,會直接執行剛剛的指令。
原因是,CMD 跟 外面接受的指令會互相覆蓋。



ENTRYPOINT

Dockerfile

FROM golang:1.16-alpine AS build-env

ENTRYPOINT ["/bin/sh","-c","echo $HOME"]

同樣也直接執行會顯示 /root ,
如果用

docker run golang:1.17 /bin/sh -c "echo $SHELL"

還是顯示 /root
原因是,使用entrypoint的話,指令不會互相覆蓋。

反而是被當成參數加在後面。

ref. Docker CMD 與 ENTRYPOINT 說明詳解

K8S yaml command

佈署個cronJob來測試

這次掛載的映像檔是使用 dockerfile『command'的映像檔
跟上面測試方法一樣,先不加command看結果是什麼
加了後結果又會是什麼。

  spec:
    containers:
    - command:
      - /bin/sh
      - -c
      - echo $PATH



11:57 那個沒有加command,所以會看到顯示root
12:03 加了上面的command,指令覆蓋,所以顯示$PATH的內容

p.s 如果不用command改用args,指令覆蓋。

K8S yaml args

這次掛載的映像檔是使用 dockerfile『ENTRYPOINT'的映像檔

  spec:
    containers:
    - args:
      - /bin/sh
      - -c
      - echo $PATH



13:44 不加任何參數,顯示 /root
13:45 加了args,還是顯示/root,指令無覆蓋

args的主要用途是,當dockerfile 為 ENTRYPOINT時,
使用args會將其視為參數傳入到image內。

ps. 如果改使用 command ,則覆蓋

ref. k8s command, args, entrypoint, cmd 區別

結論

Docker

ENTRYPOINT 主要是將整個container當做可執行檔來用。
CMD 則比較類似一台VM

K8S

command : 指令都是覆蓋
args : 外加的參數,可與command一起使用,

  spec:
    containers:
    - args:
      - -a
      command:
      - /bin/sh
      - -c
      - uname

沒有留言:

張貼留言