在Pod中定义一个容器启动时执行的命令

942 阅读1分钟

在pod定义的yaml文件中有两个参数command和args。

  • 如果在pod.yaml中没有定义 command 和 args,pod会用image中的默认命令启动容器
  • 如果在pod.yaml中如果只定义了 command 没有定义 args ,那么只运行 command,image中的arguments将被忽略
  • 如果只定义了args 没定义command,image默认命令将使用这些args
  • 如果定义了command和args,image中定义的CMD 和arguments将呗忽略

运行多个命令

多个命令被放在args中用分号分隔,此时这行命令相当于command的参数

containers:
  - name: mysqldump
    image: mysql
    command: ["/bin/sh", "-c"]
    args:
      - echo starting;
        ls -la /backups;
        mysqldump -u root -p'mypassword' -h 10.27.1.143 -P 3306 db_name > db.sql;
        ls -la /backups;
        echo done;

args中可以使用环境变量

  env:
  - name: MESSAGE
    value: "hello world"
  command: ["/bin/echo"]
  args: ["$(MESSAGE)"]

运行一个shell脚本

可以在configmap中定义一个shell脚本,再mount到容器

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  entrypoint.sh: |-
    #!/bin/bash
    echo "Do this"

    echo "Do that"
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: "ubuntu:14.04"
    command:
    - /bin/entrypoint.sh
    volumeMounts:
    - name: configmap-volume
      mountPath: /bin/entrypoint.sh
      readOnly: true
      subPath: entrypoint.sh
  volumes:
  - name: configmap-volume
    configMap:
      defaultMode: 0700
      name: my-configmap

理解Dockerfile 中 RUN CMD ENTRYPOINT 的区别

  • RUN 用于在新层中执行命令并创建新image,例如安装依赖的软件包
  • CMD 设置默认的命令和参数,容器运行时可以从命令行覆盖这些命令,比如上面提到的command和args。如果Dockerfile具有多个CMD指令,则忽略除最后一个CMD指令之外的所有指令。
  • ENTRYPOINT 配置容器启动时执行的命令,不会被忽略、一定会执行,即使docker run时指定了其他命令

Dockerfile中的命令一般有两种编写格式:

shell格式

ENTRYPOINT command param1 param2

exec格式:

ENTRYPOINT ["executable", "param1", "param2"]

参考

docs.docker.com/engine/refe…