k8s之command、args 与 CMD、ENTRYPOINT的对应关系
一、介绍
Pod中command、args与Dockerfile中ENTRYPOINT、CMD的覆盖关系。
具体的是 command 命令代替 ENTRYPOINT 的命令行,args代替 CMD 的参数。但是 并不是说 他们是一个等价的覆盖关系。
二、Dockerfile
> FROM busybox:latest
> ENTRYPOINT ["printenv"]
> CMD ["HOSTNAME", "KUBERNETES_PORT"]
Dockerfile中的CMD和ENTRYPONIT同时支持Shell格式和Exec格式
Shell格式
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
Exec格式(不推荐)
ENTRYPOINT ["echo", "hello docker"]
CMD ["echo", "hello docker"]
只有shell形式才会直接获取相关环境变量,如$HOME
Exec格式需要以shell脚本的方式去执行才能获取相关环境变量
CMD ["sh", "-c", "echo hello $NAME"]
三、Pod yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo
name: demo
namespace: demo
spec:
containers:
- command:
- echo
args:
- "小A"
image: liruilong/my-busybox
imagePullPolicy: Always
name: demo
以Shell方式运行(注意,和;)
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
或
args: ["/bin/sh", "-c", "while true; do echo hello; sleep 10;done"]
读取环境变量
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
四、覆盖关系
ENTRYPOINT | CMD | command | args | 结果 | 启动命令 |
---|---|---|---|---|---|
exec-1 | cmd-1 | ENTRYPOINT追加CMD | exec-1 cmd-1 | ||
exec-1 | cmd-1 | exec-2 | cmd-2 | command追加args | exec-2 cmd-2 |
exec-1 | cmd-1 | cmd-2 | ENTRYPOINT追加args | exec-1 cmd-2 | |
exec-1 | cmd-1 | exec-2 | command | exec-2 |
五、总结
command
和 args
均没有指定,这种情况会使用 Dockerfile
的配置的 ENTRYPOINT
和 CMD。
command
和 args
都指定了,那么 Dockerfile 的配置 ENTRYPOINT
和 CMD
被忽略,执行 command
并追加上 args
参数。
command
没有指定,指定了 args
,那么 Dockerfile 中配置的 ENTRYPOINT
的命令行会被执行,CMD
会被 args
中填写的参数覆盖,追加到 ENTRYPOINT
中。
command
指定,args
没有指定,那么 Dockerfile 默认的 ENTRYPOINT
配置会被忽略,执行输入的 command,
同时 Dockerfile 中的 CMD 也会被忽略。