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)"]

四、覆盖关系

ENTRYPOINTCMDcommandargs 结果启动命令
exec-1  cmd-1ENTRYPOINT追加CMDexec-1 cmd-1
exec-1  cmd-1exec-2cmd-2command追加argsexec-2 cmd-2
exec-1  cmd-1cmd-2ENTRYPOINT追加argsexec-1 cmd-2
exec-1  cmd-1exec-2commandexec-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 也会被忽略。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值