K8s命令参数

从Docker说起

在Docker之中有两个命令行入口定义: ENTRYPOINTCMD. 两者都是定义容器的启动命令, 两个定义方式也是相同的, 都是一个字符串数组, 类似于

1
2
ENTRYPOINT ["sh", "/opt/entrypoint.sh"]
CMD ["sh", "/opt/entrypoint.sh"]

两者的区别在于, 执行docker run后面命令行的时候, CMD的命令直接被覆盖了, 而ENTRYPOINT还依然会被执行

如果想覆盖ENTRYPOINT, 在docker run的时候需要显示指定--entrypoint

而且通常情况下, 我们会将ENTRYPOINTCMD联合使用, 类似这样:

1
2
ENTRYPOINT ["sh", "/opt/entrypoint.sh"]
CMD ["/home", "/opt"]

这种情况下, DOCKERFILE直接定义的入口脚本为sh /opt/entrypoint.sh, 但脚本的参数有CMD提供, 用户执行docker run的时候可以通过修改输入, 直接改变容器启动命令参数.

K8s的命令参数

在K8s之中, 是没有ENTRYPOINT或者CMD的, 来看一组K8s中典型的任务定义:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]

在K8s有两个关键的词: commandargs, 这两个函数和DockerFile之中的ENTRYPOINTCMD的关系如下:

分类 有args 无args
有command 覆盖Docker内的ENTRYPOINT和CMD 覆盖Docker内的ENTRYPOINT和CMD
无command 使用Docker内的ENTRYPOINT, 覆盖CMD 使用Docker默认ENTRYPOINT和CMD

推荐使用方式: K8s之中不定义command只定义args, 这样做的好处是, K8s层不需要来感知容器内部的入口, 真正的入口由容器制作者来确定, 而args则是比较变化的, 就由用户在K8s层输入即可.