在 Docker 中定义命令与参数

首先需要阐明的是,容器中运行的完整指令由两部分组成 : 命令与参数。
Dockerfile 中的两种指令分别定义命令与参数这两个部分 :

  • ENTRYPOINT 定义容器启动时被调用的可执行程序。
  • CMD 指定传递给 ENTRYPOINT 的参数。 尽管可以直接使用 CMD 指令指定镜像运行时想要执行的命令,正确的做法依旧 是借助 ENTRYPOINT 指令,仅仅用 CMD 指定所需的默认参数。

镜像可以直接运行,无须添加任何参数 :

  1. docker run <image>

或者是添加一些参数,覆盖 Dockerile 中任何由 CMD 指定的默认参数值:

  1. docker run <image > <arguments>

举例说明

  1. docker pull docker.io/luksa/fortune:args

image.png

不加cmd参数时

  1. docker run -it docker.io/luksa/fortune:args

image.png

添加cmd参数时

  1. docker run -it docker.io/luksa/fortune:args 20

image.png

在 kubernetes 中定义命令与参数

在 Kubernetes 中定义容器时,镜像的 ENTRYPOINT 和 CMD 均可以s被覆盖,仅需在容器定义中设置属性 command 和 args 的值。

docker kubernetes 描述
ENTRYPOINT command 容器中运行的可执行文件
CMD args 传给可执行文件的参数

不添加参数时

  1. cat > test.yaml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: demo-pod
  6. labels:
  7. app: myapp
  8. spec:
  9. containers:
  10. - name: test
  11. image: luksa/fortune:args
  12. EOF

image.png

image.png

添加args时

  1. cat > test-args.yaml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: demo-pod-args
  6. labels:
  7. app: myapp
  8. spec:
  9. containers:
  10. - name: test
  11. image: luksa/fortune:args
  12. args: ["20"]
  13. EOF

image.png

image.png

添加command时

command会覆盖docker中的ENTRYPOINT

  1. cat > test-command.yaml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: demo-pod-command
  6. labels:
  7. app: myapp
  8. spec:
  9. containers:
  10. - name: test
  11. image: luksa/fortune:args
  12. command: ["/bin/sh","-c","date;sleep 60;echo"]
  13. EOF

image.png

image.png

通过环境变量env传递参数

image.png

  1. cat > test-env.yaml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: demo-pod-env
  6. labels:
  7. app: myapp
  8. spec:
  9. containers:
  10. - name: test
  11. image: luksa/fortune:env
  12. env:
  13. - name: INTERVAL
  14. value: "30"
  15. EOF

image.png

image.png

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