前言
正文
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
0 意見:
張貼留言