一、介绍

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 也会被忽略。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐