创建工作负载或任务时,通常通过镜像指定容器中运行的进程。
在默认情况下,镜像会运行默认命令,如果想运行特定命令或重写镜像默认值,需要用到以下设置:
- 工作目录:指定运行命令的工作目录。
若镜像中未指定工作目录,且在界面中也未指定,默认是“/”。
- 运行命令:控制镜像运行的实际命令。
- 运行参数:传递给运行命令的参数。
说明:
- 容器启动后,容器中的内容不应修改。如果修改配置项(例如将容器应用的密码、证书、环境变量配置到容器中),当容器重启(例如节点异常重新调度pod)后,会导致配置丢失,业务异常。
- 配置信息应通过入参等方式导入容器中,以免重启后配置丢失。
容器如何执行命令和参数
Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时会运行镜像制作时提供的默认的命令和参数,Docker原生定义这两个字段为“Entrypoint”和"CMD"。
如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令"Entrypoint"、"CMD",规则如下:
容器执行命令和参数
镜像 Entrypoint | 镜像CMD | 容器运行命令 | 容器运行参数 | 最终执行 |
[touch] | [/root/test] | 未设置 | 未设置 | [touch /root/test] |
[touch] | [/root/test] | [mkdir] | 未设置 | [mkdir] |
[touch] | [/root/test] | 未设置 | [/opt/test] | [touch /opt/test] |
[touch] | [/root/test] | [mkdir] | [/opt/test] | [mkdir /opt/test] |
步骤 1 登录CCE控制台,在创建工作负载或任务时,展开“生命周期”。
步骤 2 在启动命令后,输入运行命令和运行参数,如下表。
容器启动命令
命令方式 | 操作步骤 |
运行命令 | 输入可执行的命令,例如“/run/server”。 若运行命令有多个,多个命令之间用空格进行分隔。若命令本身带空格,则需要加引号("")。 说明 多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。 |
运行参数 | 输入控制容器运行命令参数,例如--port=8080。 若参数有多个,多个参数以换行分隔。 |
说明:
- 当前启动命令以字符串数组形式提供,对应于Docker的Entrypoint启动命令,格式为: ["executable", "param1", "param2",..]。Kubernetes的容器启动命令可参见这里。
- 容器的生命周期与启动命令的生命周期一致,即启动命令执行完成后容器的生命周期结束。
下面将以启动一个nginx为例,介绍容器启动命令典型的三个使用场景:
示例代码如下:
nginx -c nginx.conf
- 场景一:容器的“运行命令”和“运行参数”均作设置,界面截图如下:
运行命令和运行参数均设置
所生成的YAML样例如下:
command:
- nginx
args:
- '-c'
- nginx.conf
- 场景二:仅设置容器的“运行命令”,界面截图如下:
仅设置运行命令
说明:
运行命令中前后要加英文双引号"",若不加则会按照空格将命令拆分成多条执行。
所生成的YAML样例如下:
command:
- nginx -c nginx.conf
args:
- 场景三:仅设置容器的“运行参数”,界面截图如下:
仅设置运行参数
说明:
如果运行命令没有添加到系统路径中,可以使用/bin/sh来执行命令,命令需要加英文双引号""。
所生成的YAML样例如下:
command:
- /bin/sh
args:
- '-c'
- '"nginx -c nginx.conf"'
步骤 3 您可以通过如下方式检查或修改YAML:
- 创建工作负载时,在“高级设置”步骤中,单击右侧的“YAML创建”。
- 工作负载创建完成后,在工作负载列表中,单击工作负载名称后的“更多 > 编辑YAML”。
- 工作负载创建完成后,进入工作负载详情页面,单击右上角的“编辑YAML”。
本节以nginx为例,说明通过kubectl设置容器启动命令的方法。
前提条件
请参见通过kubectl操作CCE集群配置kubectl命令,使弹性云主机连接集群。
操作步骤
参见通过kubectl命令行创建无状态工作负载或通过kubectl命令行创建有状态工作负载时,容器启动命令的参数设置如下所示,详细请参见kubernetes官方文档。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
command:
- sleep
- '3600' #启动命令
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- /bin/bash
- install.sh #启动后命令
preStop:
exec:
command:
- /bin/bash
- uninstall.sh #停止前命令
name: nginx
imagePullSecrets:
- name: default-secret