在 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 << EOF
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
labels:
app: myapp
spec:
containers:
- name: test
image: luksa/fortune:args
EOF
添加args时
cat > test-args.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-args
labels:
app: myapp
spec:
containers:
- name: test
image: luksa/fortune:args
args: ["20"]
EOF
添加command时
command会覆盖docker中的ENTRYPOINT
cat > test-command.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-command
labels:
app: myapp
spec:
containers:
- name: test
image: luksa/fortune:args
command: ["/bin/sh","-c","date;sleep 60;echo"]
EOF
通过环境变量env传递参数
cat > test-env.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-env
labels:
app: myapp
spec:
containers:
- name: test
image: luksa/fortune:env
env:
- name: INTERVAL
value: "30"
EOF
注意不要忘记在每个容器中, Kubemetes 会自动暴露相同命名空间下每个 service 对应的环境变量。 这些环境变量基本上可以被看作自动注入的配直。