在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"]