
# 使用容器镜像创建函数
FunctionGraph支持加载并运行容器镜像中的函数，相较于直接上传代码的方式，用户能够使用自定义代码包，灵活且减少了迁移成本。
支持使用公开和私有的镜像类型，具体详情请参考[编辑镜像属性](https://support.huaweicloud.com/usermanual-swr/swr_01_0016.html)。
#### 约束与限制
表1约束与限制 
| 限制类别          | 具体限制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|
| 自定义容器镜像端口约束限制 | - 自定义容器镜像需包含HTTP Server，监听端口为8000。  - 自定义容器镜像开放端口限定为8000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 容器镜像函数约束限制    | - 事件函数需创建一个HTTP Server并实现Method为POST和Path为/invoke的函数执行入口，可实现Method为POST和Path为/init的函数初始化入口。  - 函数返回要求：函数必须返回一个符合以下结构的合法HTTP响应。 ``` { "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": {"headerName":"headerValue",...}, "body": "..." } ```   - Command、Args、Working dir三个参数之和不能超过5120。  - 初次执行时需要从SWR中拉取镜像，且函数冷启动时需要启动容器，所以自定义镜像冷启动比较慢。后续每次冷启动，如果节点上没有镜像，都需要从SWR中拉取。  - 可支持的镜像包最大为10G，当镜像包过大时可以采取一些方式缩容，比如在线题库场景中，可以把原来加载在容器中的题库数据通过外部文件系统挂载盘方式挂载到容器中。  - oom错误时，内存占用大小可以在函数执行结果中查看。   |
   
#### 前提条件
- 使用函数工作流控制台的所有操作均默认具有操作权限，请确保您登录的用户已有"FunctionGraph Administrator"权限，即FunctionGraph服务所有权限，更多权限的说明请参考[权限管理](https://support.huaweicloud.com/productdesc-functiongraph/functiongraph_01_0160.html)。
- 请参见[配置函数的委托权限](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html)，创建一个包含"SWR Admin容器镜像服务（SWR）管理员"权限的委托。用户镜像储存在容器镜像服务SWR中，函数需拥有"SWR Admin"权限才能调用与获取镜像。
 
#### 创建函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击右上方的"创建函数"，进入"创建函数"页面。
3. 创建方式选择"容器镜像"，配置信息参见[表2]，参考[表3]配置函数高级设置参数。
    表2容器镜像配置信息 
   | 参数     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 取值样例                                                     |
   |:---|:---|:---|
   | 函数类型   | 支持以下两种类型： - 事件函数：通常为JSON格式的请求，事件函数不受触发器类型的限制，当前FunctionGraph支持的所有类型触发器均可用于触发事件函数。  - HTTP函数：用户可以直接发送HTTP请求到URL触发函数执行。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 事件函数                                                     |
   | 区域     | 选择要部署代码的区域。 **不同区域的资源之间内网不互通，请就近选择靠近您业务的区域，可以降低网络时延、提高访问速度。**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 华东-上海一                                                   |
   | 函数名称   | 函数名称，命名规则如下： - 可包含字母、数字、下划线和中划线，长度不超过60个字符。  - 以大/小写字母开头，以字母或数字结尾。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | SWR-demo                                                 |
   | 企业项目   | 选择函数所属的企业项目。企业项目是一种云资源管理方式，由企业项目管理服务提供统一的云资源按项目管理功能，支持对项目内的资源和成员进行管理。 默认为"default"，支持用户选择已创建的企业项目。 **如果您没有开通企业管理服务，将无法看到企业项目选项。开通方法请参见[如何开通企业项目](https://support.huaweicloud.com/usermanual-em/eps_15_0001.html)。**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | default                                                  |
   | 委托     | 选择函数的委托。通过委托函数工作流来访问其他云服务，需选择包含SWR Admin权限的委托，如需创建委托，请参见[创建委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section17872123319473)。 当华为云账号下无函数默认委托时，FunctionGraph提供快速创建默认委托"fgs_default_agency"的功能，详情请参见[默认委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section102217211358)。                                                                                                                                                                                                                                                                                                                                                                                                                                | fgs_default_agency                                       |
   | 容器镜像   | 输入镜像URL，即用于函数的容器镜像的位置。您可以单击"查看镜像"，查看自有镜像及共享镜像。同时，也支持单击"选择镜像"功能，用户可在镜像列表中选择公开或私有镜像，选择成功后会自动填充镜像URL。如何制作镜像，请参见[制作镜像](https://support.huaweicloud.com/qs-functiongraph/functiongraph_04_0103.html#section2)。 SWR中的镜像名，例如swr.region_id.myhuaweicloud.com/my_group/my_image:latest。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | swr.region_id.myhuaweicloud.com/my_group/my_image:latest |
   | 监听端口   | **当前仅支持"中东-利雅得"区域支持配置该参数。** 配置代码中的HTTP Server所监听的端口，需要与镜像中配置的"EXPOSE"端口保持一致，端口取值范围是1025\~65535，默认值为8000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 8000                                                     |
   | 容器镜像覆盖 | 可选参数。 此处如果配置，则会覆盖dockerfile文件中的镜像配置，如果不配置则使用镜像默认配置。 - CMD：容器的启动命令，例如"/bin/sh"。该参数为可选参数，不填写，则默认使用镜像中的Entrypoint/CMD。字符串数组，以逗号分开。  - Args：容器的启动参数，例如"-args,value1"。该参数为可选参数，不填写，则默认使用镜像中的CMD。字符串数组，以逗号分开。  - Working Dir：容器的工作目录。该参数为可选参数，不填写，则默认使用镜像中的配置。文件夹路径，以/开头。  - 用户ID：镜像运行时的用户ID，若不填写，默认为1003。  - 用户组ID：镜像运行时的用户组ID，若不填写，默认为1003。   | -                                                        |
      
   图1创建函数高级设置参数说明   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002477971774.png "点击放大")
   
    表3创建函数高级设置参数说明 
   | 参数         | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 取值样例                      |
   |:---|:---|:---|
   | 函数访问公网     | 开启时，函数可以通过默认网卡访问公网上的服务，其公网访问带宽为用户间共享，仅适用于测试场景。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 开启                        |
   | 函数访问VPC内资源 | **开启此参数需要函数配置包含VPC管理权限的委托，若基本信息的委托中选择"未使用任何委托"则无法开启。** 开启时，函数将使用配置的VPC所绑定的网卡进行网络访问，同时禁用函数工作流的默认网卡，即开关"函数访问公网"参数将不生效。 开启后可选择函数需访问的VPC及其子网。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 未开启                       |
   | 日志记录       | 启用日志功能后，函数运行过程中产生的日志会上报到云日志服务(LTS)。 注意： LTS将按需收取日志管理费用，详情请参见[云日志服务价格详情](https://www.huaweicloud.com/pricing/calculator.html#/lts)。 开启后可配置以下参数： - 日志配置方式 - 自动配置：使用默认日志组和日志流。  - 自定义配置：选择自定义创建的日志组和日志流。    - 日志标签 函数执行时，会将日志标签配置上报到LTS，可通过标签在LTS控制台对函数日志进行过滤筛选，日志标签详情请参见[日志管理](https://support.huaweicloud.com/usermanual-lts/lts_04_0003.html#lts_04_0003__table9217134717322)。 标签键/标签值只能包含数字、字母、下划线和中划线，标签最大长度为64。最多支持添加10个标签。                                                                                                                                | 未开启                       |
   | 标签         | 为函数添加标签，标签用于标识和分类函数资源。 添加标签后，可在"函数列表"页面通过标签快速检索和定位函数，便于系统化管理资源。 标签与函数资源间为多对多关系，最多支持为单个函数添加20个标签。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | -                         |
   | KMS静态加密代码  | 当前仅"拉美-圣保罗一"区域支持配置该参数。 选择是否使用KMS静态加密函数代码。 注意： 密码安全中心DEW将按需收取费用，详情请参见[密码安全中心计费说明](https://support.huaweicloud.com/price-dew/dew_03_0006.html)。 支持选择以下加密类型： - （默认）functiongraph/default：函数会在您账号下的DEW服务中自动创建默认密钥，您无需手动创建。 首次使用该默认密钥进行加解密，需确保函数委托中拥有以下权限：kms:dek:decrypt、 kms:dek:create、 kms:cmk:create、kms:cmk:get、 kms:cmk:list。   - 使用用户主密钥：支持选择已创建的密钥加密函数代码，创建用户主密钥可参考[创建自定义密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html)。使用用户主密钥，需确保函数委托中拥有以下权限：kms:dek:decrypt、 kms:dek:create、 kms:cmk:get、 kms:cmk:list。 注意： 若选择"使用用户主密钥"，在后续使用中请勿在DEW服务中删除用于函数加密的主密钥，否则将因加密数据无法解密而导致函数执行失败。    请参考[JSON视图配置自定义策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0605.html#section1)前往IAM控制台配置函数的委托权限策略。 | （默认）functiongraph/default |
      
   
4. 配置完成后单击"创建函数"，页面跳转至函数详情配置页面，各配置项操作请参见[配置函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0300.html)。
 
#### 更新函数镜像
在容器镜像函数的代码配置页面中，选择"代码"页签，右侧单击"部署新镜像"，在输入框中输入新镜像的URL，单击"确定"完成部署。镜像URL获取方式如下：
1. 登录容器镜像服务控制台，左侧导航栏选择"我的镜像"。
2. 选择"自有镜像"或"他人共享"页签，在镜像列表中单击镜像名称，进入详情页面。
3. 选择"镜像版本"页签，在镜像版本列表中复制下载指令，指令中去掉"docker pull"，即为镜像URL。
 
#### 相关文档
- 针对不同使用场景，函数工作流支持通过在线编写代码、上传代码文件或者使用容器镜像，创建事件函数和HTTP函数，且支持使用GPU计算资源。如何针对应用场景进行函数类型选型，详情请参见[函数类型选型](https://support.huaweicloud.com/productdesc-functiongraph/functiongraph_02_1001.html)。
- 除使用控制台外，函数工作流支持通过API的方式创建函数，详情请参见[创建函数](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0108.html)。
- 使用容器镜像常见问题：[使用相同名称的镜像更新镜像时，预留实例无法自动更新，会一直使用老镜像](https://support.huaweicloud.com/functiongraph_faq/functiongraph_03_0875.html)。
 
