在 Docker 中定义命令与参数
首先需要阐明的是,容器中运行的完整指令由两部分组成 : 命令与参数。
Dockerfile 中的两种指令分别定义命令与参数这两个部分 :
- ENTRYPOINT 定义容器启动时被调用的可执行程序。
- CMD 指定传递给 ENTRYPOINT 的参数。 尽管可以直接使用 CMD 指令指定镜像运行时想要执行的命令,正确的做法依旧 是借助 ENTRYPOINT 指令,仅仅用 CMD 指定所需的默认参数。
镜像可以直接运行,无须添加任何参数 :
docker run <image>
或者是添加一些参数,覆盖 Dockerile 中任何由 CMD 指定的默认参数值:
docker run <image > <arguments>
举例说明
docker pull docker.io/luksa/fortune:args

不加cmd参数时
docker run -it docker.io/luksa/fortune:args

添加cmd参数时
docker run -it docker.io/luksa/fortune:args 20

在 kubernetes 中定义命令与参数
在 Kubernetes 中定义容器时,镜像的 ENTRYPOINT 和 CMD 均可以s被覆盖,仅需在容器定义中设置属性 command 和 args 的值。
| docker | kubernetes | 描述 |
|---|---|---|
| ENTRYPOINT | command | 容器中运行的可执行文件 |
| CMD | args | 传给可执行文件的参数 |
不添加参数时
cat > test.yaml << EOFapiVersion: v1kind: Podmetadata:name: demo-podlabels:app: myappspec:containers:- name: testimage: luksa/fortune:argsEOF


添加args时
cat > test-args.yaml << EOFapiVersion: v1kind: Podmetadata:name: demo-pod-argslabels:app: myappspec:containers:- name: testimage: luksa/fortune:argsargs: ["20"]EOF


添加command时
command会覆盖docker中的ENTRYPOINT
cat > test-command.yaml << EOFapiVersion: v1kind: Podmetadata:name: demo-pod-commandlabels:app: myappspec:containers:- name: testimage: luksa/fortune:argscommand: ["/bin/sh","-c","date;sleep 60;echo"]EOF


通过环境变量env传递参数

cat > test-env.yaml << EOFapiVersion: v1kind: Podmetadata:name: demo-pod-envlabels:app: myappspec:containers:- name: testimage: luksa/fortune:envenv:- name: INTERVALvalue: "30"EOF


注意不要忘记在每个容器中, Kubemetes 会自动暴露相同命名空间下每个 service 对应的环境变量。 这些环境变量基本上可以被看作自动注入的配直。
