K8s命令参数
从Docker说起
在Docker之中有两个命令行入口定义: ENTRYPOINT
和CMD
. 两者都是定义容器的启动命令, 两个定义方式也是相同的, 都是一个字符串数组, 类似于
1 | ENTRYPOINT ["sh", "/opt/entrypoint.sh"] |
两者的区别在于, 执行docker run
后面命令行的时候, CMD
的命令直接被覆盖了, 而ENTRYPOINT
还依然会被执行
如果想覆盖
ENTRYPOINT
, 在docker run的时候需要显示指定--entrypoint
而且通常情况下, 我们会将ENTRYPOINT
和CMD
联合使用, 类似这样:
1 | ENTRYPOINT ["sh", "/opt/entrypoint.sh"] |
这种情况下, DOCKERFILE
直接定义的入口脚本为sh /opt/entrypoint.sh
, 但脚本的参数有CMD
提供, 用户执行docker run
的时候可以通过修改输入, 直接改变容器启动命令参数.
K8s的命令参数
在K8s之中, 是没有ENTRYPOINT
或者CMD
的, 来看一组K8s中典型的任务定义:1
2
3
4
5
6
7
8
9
10
11
12apiVersion: 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有两个关键的词: command
和args
, 这两个函数和DockerFile之中的ENTRYPOINT
和CMD
的关系如下:
分类 | 有args | 无args |
---|---|---|
有command | 覆盖Docker内的ENTRYPOINT和CMD | 覆盖Docker内的ENTRYPOINT和CMD |
无command | 使用Docker内的ENTRYPOINT, 覆盖CMD | 使用Docker默认ENTRYPOINT和CMD |
推荐使用方式: K8s之中不定义command
只定义args
, 这样做的好处是, K8s层不需要来感知容器内部的入口, 真正的入口由容器制作者来确定, 而args
则是比较变化的, 就由用户在K8s层输入即可.