
# 设置容器生命周期
#### 操作场景
设置生命周期回调函数可在容器的特定阶段执行调用，比如容器在停止前希望执行某项操作，就可以设置相应的函数。
目前提供的生命周期回调函数如下所示：
- **启动命令：** 容器将会以该启动命令启动，请参见[启动命令]。
- **启动后处理：** 容器启动后触发，请参见[启动后处理]。
- **停止前处理：** 容器停止前触发。设置停止前处理，确保升级或实例删除时可提前将实例中运行的业务排水。详细请参见[停止前处理]。
 
 #### 启动命令
在默认情况下，镜像启动时会运行默认命令，如果想运行特定命令或重写镜像默认值，需要进行相应设置。
Docker的镜像拥有存储镜像信息的相关元数据，如果不设置生命周期命令和参数，容器运行时将运行镜像制作时提供的默认的命令和参数，Docker将这两个字段定义为ENTRYPOINT和 CMD。
如果在创建工作负载时填写了容器的运行命令和参数，将会覆盖镜像构建时的默认命令ENTRYPOINT、CMD，规则如下：
表1容器如何执行命令和参数 
| 镜像 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. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，进入集群联邦页面，在创建工作负载时，配置容器信息，选择"生命周期"。
2. 在"启动命令"页签，输入运行命令和运行参数。 
   表2容器启动命令 
   | 命令方式 | 操作步骤                                                                                                                                                                                                                                                                                                  |
   |:---|:---|
   | 运行命令 | 输入可执行的命令，例如"/run/server"。 若运行命令有多个，多个命令之间用空格进行分隔。若命令本身带空格，则需要加引号（""）。 说明： 多命令时，运行命令建议用/bin/sh或其他的shell，其他全部命令作为参数来传入。 |
   | 运行参数 | 输入控制容器运行命令参数，例如--port=8080。 若参数有多个，可添加运行参数。                                                                                                                                                                                                  |
      
   
   
 
 #### 启动后处理
1. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，进入集群联邦页面，在创建工作负载时，配置容器信息，选择"生命周期"。
2. 在"启动后处理"页签，设置启动后处理的参数。 
   表3启动后处理-参数说明 
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|
   | 命令行方式    | 在容器中执行指定的命令，配置为需要执行的命令。命令的格式为Command Args\[1\] Args\[2\]...（Command为系统命令或者用户自定义可执行程序，如果未指定路径则在默认路径下寻找可执行程序），如果需要执行多条命令，建议采用将命令写入脚本执行的方式。 如需要执行的命令如下： ``` exec: command: - /install.sh - install_agent ``` 请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。                                                                                                                                                                                          |
   | HTTP请求方式 | 发起一个HTTP调用请求。配置参数如下： - 路径：请求的URL路径，可选项。  - 端口：请求的端口，必选项。  - 主机地址：请求的IP地址，可选项，默认为实例IP。   |
      
   
   
 
 #### 停止前处理
1. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，进入集群联邦页面，在创建工作负载时，配置容器信息，选择"生命周期"。
2. 在"停止前处理"页签，设置停止前处理的命令。 
   表4停止前处理 
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   |:---|:---|
   | 命令行方式    | 在容器中执行指定的命令，配置为需要执行的命令。命令的格式为Command Args\[1\] Args\[2\]...（Command为系统命令或者用户自定义可执行程序，如果未指定路径则在默认路径下寻找可执行程序），如果需要执行多条命令，建议采用将命令写入脚本执行的方式。 如需要执行的命令如下： ``` exec: command: - /uninstall.sh - uninstall_agent ``` 请在执行脚本中填写: /uninstall uninstall_agent。这条命令表示容器结束前将执行uninstall.sh。                                                                                                                                                                                |
   | HTTP请求方式 | 发起一个HTTP调用请求。配置参数如下： - 路径：请求的URL路径，可选项。  - 端口：请求的端口，必选项。  - 主机地址：请求的IP地址，可选项，默认为实例IP。   |
      
   
   
 
#### YAML样例
本节以nginx为例，说明kubectl命令设置容器生命周期的方法。
在以下配置文件中，您可以看到postStart命令在容器目录/bin/bash下写了个**install.sh** 命令。preStop执行**uninstall.sh**命令。
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  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
```
