
# 制作镜像并推送到SWR仓库
CodeArts Build默认提供大量构建步骤、模板等，如果已有工具不能满足用户的使用要求，如缺少必要的依赖包、工具等，也可以根据实际需要，通过自定义Dockerfile文件的方式制作镜像并推送至指定的SWR仓库后使用，使用自定义镜像的操作指导可参考[使用自定义构建环境](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_00142.html)。
编译构建使用centos7和ubuntu18作为基础镜像，并提供多种构建常用的配置环境工具，用户可以根据需要配置自定义构建环境。Dockerfile文件下载路径如下：
1. 在编译构建首页右上角单击"更多"，在下拉列表选择"自定义构建环境"。
2. 进入自定义构建环境页面，选择合适的基础镜像，单击即可下载Dockerfile模板。
3. 编辑下载的Dockerfile文件。
   可根据需要加入项目需要的其他依赖和工具，完成Dockerfile文件自定义，如下为添加了jdk和maven工具的示例。
   ```
   RUN yum install -y java-1.8.0-openjdk.x86_64
   RUN yum install -y maven
   RUN echo 'hello world!'
   RUN yum clean all
   ```
   
#### 操作视频
本视频介绍基于自定义Maven镜像并推送至SWR的操作。
<video controls="controls" preload="none" id="object155207364916" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/cloudbuild_video/1636957277883026330.mp4" title="自定义镜像并推送至SWR" poster="https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000002354431729.jpg" height="300.0000" width="600.0000"></video>
 #### 推送至SWR前准备工作
- 已在容器镜像服务[创建组织](https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html)。组织的约束与限制参考容器镜像服务的[约束与限制](https://support.huaweicloud.com/productdesc-swr/swr_03_0007.html)。
- 如果您制作后的镜像需要推送至华为云其他用户的SWR中，需[新建IAM账户服务扩展点](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0019.html#section9)。
- 如果您制作后的镜像需要推送至其他镜像仓库，需[新建Docker repository服务扩展点](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0019.html#section2)。
 
- [图形化构建]
  在[配置构建步骤](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0059.html)中，"Maven构建"步骤后添加"制作镜像并推送到SWR仓库"构建步骤。
  "Maven构建"构建步骤参数保持默认即可，如当前参数配置不满足使用要求，可参考[Maven构建](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_00051.html)修改参数配置。"制作镜像并推送到SWR仓库"构建步骤参数配置说明如[表1]。
   表1制作镜像并推送到SWR仓库参数说明 
  | **参数**       | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
  |:---|:---|
  | 步骤显示名称       | 构建步骤的名称，可自定义修改。 - 支持中文、英文、数字、"-"、"_"、英文逗号、英文分号、英文冒号、"."、"/"、圆括号（中英文）。  - 字符长度范围为1\~128。                                                                                                               |
  | 工具版本         | 选择使用的Docker版本，使用默认版本即可。 默认版本为docker-18.03，当前支持"docker 18.03"、"docker 20.10"。                                                                                                                                                                                                                                                                                                                                                                     |
  | 镜像仓库         | 选择需要推送的镜像仓库。支持推送至华为云镜像仓库SWR和其他镜像仓库，根据实际情况选择即可。                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  | 授权用户         | 推送的镜像仓库的所属用户。支持推送至当前用户和其他用户。 需确保用户对组织内所有镜像具有编辑或管理权限，详见[授权管理](https://support.huaweicloud.com/usermanual-swr/swr_01_0015.html)。 当"镜像仓库"选择"华为云镜像仓库SWR"时需要配置该参数。                                                                                                                                                                                                                                                |
  | IAM账号        | 在下拉框中选择[推送至SWR前准备工作]中创建的"IAM账户"服务扩展点，通过服务扩展点推送至其他用户的SWR中。 当"授权用户"选择"其他用户"时需要配置该参数。                                                                                                                                                                                                                                                                                                                          |
  | 推送区域         | 选择需要推送的区域。镜像制作成功后，会将镜像依次推送到选中区域的SWR仓库。 当"镜像仓库"选择"华为云镜像仓库SWR"时需要配置该参数。                                                                                                                                                                                                                                                                                                                                                                          |
  | 镜像仓接入点       | 选择[推送至SWR前准备工作]中创建的"Docker repository"服务扩展点，通过服务扩展点推送至其他镜像仓库。 当"镜像仓库"选择"其他镜像仓库"时需要配置该参数。                                                                                                                                                                                                                                                                                                                   |
  | 组织           | 在下拉框中选择[推送至SWR前准备工作]中创建好的组织名，选择镜像推送到SWR后所属的组织。                                                                                                                                                                                                                                                                                                                                                                                              |
  | 镜像名字         | 自定义填写制作完成后的镜像名称。 需以数字或字母开头，仅支持小写字母、数字、"_"、"-"，字符长度为1\~255。                                                                                                                                                                                                                                                                                                                                                                                      |
  | 镜像标签         | 用来标记镜像的版本，可自定义。通过"镜像名:标签"可以唯一指定镜像。 仅支持大小写字母、数字、"."、"_"、"-"，不可以"."或"-"开头，字符长度为1\~128。                                                                                                                                                                                                                                                                                                                                                            |
  | 工作目录         | docker build的工作目录。填写docker build命令中的"上下文路径"参数，该路径是代码仓库根目录的相对路径。 上下文路径，指的是docker在构建镜像时，docker build命令将该路径下的所有内容打包给容器引擎，帮助构建镜像。                                                                                                                                                                                                                                                                                                                  |
  | Dockerfile路径 | Dockerfile文件所在路径，请填写相对于工作目录的路径，如：工作目录为根目录， 且Dockerfile文件在根目录下，则此处填写为"./Dockerfile"。                                                                                                                                                                                                                                                                                                                                                                                             |
  | 构建参数         | 可选参数。如果用户在docker命令中，需要使用build-arg参数，可配置此参数。 单击"添加"，配置对应的"参数名"和"参数值"。 - "参数名"仅支持中英文、数字、下划线"_"连字符"-"，长度范围1\~128字符。  - "参数值"字符长度不能大于8192。   ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000002368871537.png) |
  | 使用缓存         | 配置是否使用缓存。如果不使用缓存，**docker build** 命令将使用**--pull** 和**--no-cache**参数进行镜像构建。 - 是：使用缓存。  - 否：不使用缓存。                                                                                                                                                                               |
  | 添加构建元数据到镜像   | 配置是否将本次构建信息添加到镜像中，镜像制作完成后可以通过docker inspect命令查看镜像元数据。                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | 失败后是否继续运行    | 当前步骤执行失败后是否继续执行下一个步骤，根据实际使用场景选择是或否。                                                                                                                                                                                                                                                                                                                                                                                                                                             |
     
- [代码化构建]
  参考以下代码示例，修改在[创建代码化构建使用的YAML文件](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0058.html#codeci_ug_0058__section72391847131511)中的BUILD部分代码信息。
  ```
  version: 2.0 # 必须是2.0
  steps:
    BUILD:
      - build_image:
          name: buildImage
          inputs:
            regions: ["x-x-x", "x-x-xxx"]
            organization: codeci_test
            image_name: demo
            image_tag: ${GIT_COMMIT}
            dockerfile_path: dockerfile/Dockerfile
            build_args:
              - name: aaa
                value: iuhascihsd
            # set_meta_data: true
            ignore_fail: true
  ```
  表2制作镜像并推送到SWR仓库代码示例参数说明 
  | **参数**          | **类型** | **说明**                                                                                                                                                                                                                                                                                                                               |
  |:---|:---|:---|
  | regions         | list   | 可选参数。 选择要上传的区域SWR。默认上传到当前任务所在region的SWR。如果配置多个region，镜像制作成功后，会将镜像依次推送到填写region的SWR仓库中。                                                                                                                                                                                                              |
  | organization    | string | 配置镜像推送到SWR后所属的组织名称。组织名称为[推送至SWR前准备工作]中创建好的组织名。                                                                                                                                                                                                                                                   |
  | image_name      | string | 可选参数。 自定义填写制作完成后的镜像名称。 需以数字或字母开头，仅支持小写字母、数字、"_"、"-"，字符长度为1\~255。 默认值：demo。                                                                                                                                                           |
  | image_tag       | string | 可选参数。 用来标记镜像的版本，可自定义。通过"镜像名:标签"可以唯一指定镜像。 仅支持大小写字母、数字、"."、"_"、"-"，不可以"."或"-"开头，字符长度为1\~128。 默认值：v1.1。                                                                                                                            |
  | context_path    | string | 可选参数。 docker build的工作目录。填写docker build命令中的"上下文路径"参数，该路径是代码仓库根目录的相对路径。 上下文路径，指的是docker在构建镜像时，docker build命令将该路径下的所有内容打包给容器引擎，帮助构建镜像。 默认值："."。                                                                                     |
  | dockerfile_path | string | 可选参数。 Dockerfile文件所在路径，请填写相对于工作目录的路径，如：工作目录为根目录， 且Dockerfile文件在根目录下，则此处填写为"./Dockerfile"。 默认值：./Dockerfile。                                                                                                                                                       |
  | build_args      | string | 可选参数。如果用户在docker命令中，需要使用build-arg参数，可配置此参数。                                                                                                                                                                                                                                                                                          |
  | set_meta_data   | bool   | 可选参数。 配置是否将本次构建信息添加到镜像中，镜像制作完成后可以通过docker inspect命令查看镜像元数据。 - true：添加。  - false：不添加。   默认值：false。 |
  | ignore_fail     | string | 用于控制当前步骤执行失败后是否继续执行下一个步骤。 - true：是。  - 为空：否。                                  |
     
#### 相关文档
- 镜像相关案例可参考[CodeArts Build最佳实践](https://support.huaweicloud.com/bestpractice-codeci/codeci_practice_1022.html)中镜像的最佳实践案例。
- 相关API可参考[镜像模板](https://support.huaweicloud.com/api-codeci/topic_300000002.html)。
- 镜像相关常见问题可参考[镜像问题](https://support.huaweicloud.com/codeci_faq/codeci_faq_0021.html)。
 
