提交容器生成镜像并推送到ACR

根据业务需求,启动ECI实例后,您可能需要在容器内部进行一些操作修改。如果您想要保留修改后的环境,可以将修改过的容器环境打包成镜像,并推送到ACR,以便后续可以使用。本文介绍如何通过CommitContainer和DescribeCommitContainerTask接口提交容器生成镜像并推送到ACR。

准备工作

  1. 创建ACR实例和镜像仓库,并获取镜像仓库地址。

    关于如何创建ACR实例和镜像仓库,请参见以下文档:

    创建成功后,从镜像仓库页面获取仓库地址。本文使用私网地址。

    镜像仓库地址.png

  2. 创建RAM角色并授权,然后获取角色的ARN。

    1. 创建RAM角色。

      具体操作,请参见创建可信实体为阿里云服务的RAM角色。需要注意的配置如下:

      • 选择类型页面,可信实体类型选择阿里云服务

      • 配置角色页面,角色类型选择普通服务角色,角色名称可以自定义输入,受信服务选择弹性容器实例ECI

    2. 为RAM角色授权。

      具体操作,请参见为RAM角色授权。授权时,请选择AliyunContainerRegistryFullAccess权限策略。

    3. 获取角色的ARN。

      在角色详情页面的基本信息处可以获取ARN。

      角色ARN.png

配置说明

调用CommitContainer接口创建异步任务,可以将ECI实例中的指定容器保存为镜像,并推送至阿里云ACR的镜像仓库中。CommitContainer接口的主要参数说明如下,更多信息,请参见CommitContainer

名称

类型

示例值

描述

ContainerGroupId

string

eci-bp1do4xz75fa5sd****

要创建CommitContainer任务的ECI实例ID。

ContainerName

string

container-1

要制作镜像的容器的名称。

Image.Repository

string

registry-vpc.cn-beijing.aliyuncs.com/test/test-****

ACR镜像仓库地址。

出于安全考虑,目前仅支持将镜像推送(Push)至ACR。

Image.Tag

String

1.0.1

镜像标签。

AcrRegistryInfo.InstanceId

string

cri-nwj395hgf6f3****

ACR企业版实例ID。

使用ACR个人版实例时无需配置该参数;使用ACR企业版实例时必须配置该参数。

AcrRegistryInfo.RegionId

string

cn-beijing

ACR企业版实例所属的地域。

使用ACR个人版实例时无需配置该参数;使用ACR企业版实例时必须配置该参数。

Arn.RoleArn

string

acs:ram::1609982529******:role/commit-test

授权角色的ARN。配置和获取方式请参考准备工作。

Arn.RoleType

string

service

授权类型。可配置为service,表示使用RAM角色进行授权。

调用CommitContainer接口成功后,会返回TaskId。您可以通过该TaskId调用DescribeCommitContainerTask接口查询任务状态。如果返回的TaskStatus为Succeeded,则表示已成功生成镜像并推送到ACR。关于DescribeCommitContainerTask接口的详细参数说明,请参见DescribeCommitContainerTask

配置示例

  1. 创建一台ECI实例A。

  2. 连接ECI实例A,在容器内进行操作。

    此处以在容器写入一个文件(hello.txt)作为示例。

    eci-commit

  3. 调用CommitContainer接口,将实例A中的容器环境打包成镜像,并推送到ACR。

    采用的参数示例如下:

    RegionId=cn-beijing
    ContainerGroupId=eci-2zeh3j8kdnqvnf5n****
    ContainerName-container-1
    Image.Repository=registry-vpc.cn-beijing.aliyuncs.com/***-test/***-registry
    Image.Tag=1.0.1
    Arn,RoleArn=acs:ram::1609982529******:role/commit-test
    Arn.RoleType=service

    如果使用ACR企业版实例,需增加ACR企业版实例的访问凭证配置信息,即AcrRegistryInfo相关参数,示例如下:

    AcrRegistryInfo.InstanceId=cri-nwj395hgf6f3****
    AcrRegistryInfo.RegionId=cn-beijing

    预期返回如下:

    {
      "TaskId": "t-2zej6nstkg744qc3****",
      "RequestId": "4ADE19FF-C487-5020-A6E4-03D5D9708834"
    }
  4. 调用DescribeCommitContainerTask接口查看任务状态。

    采用的参数示例如下:

    RegionId=cn-beijing
    TaskId=["t-2zej6nstkg744qc3****"]

    预期返回如下,TaskStatus为Succeeded表示任务执行成功,在CommitPhaseInfos中可以看到PushCommittedImage阶段成功的信息,表示镜像已推送到指定的ACR镜像仓库中。

    {
      "TotalCount": 1,
      "CommitTasks": [
        {
          "TaskId": "t-2zej6nstkg744qc3****",
          "ContainerName": "container-1",
          "CommitPhaseInfos": [
            ......
            {
              "Status": "Success",
              "RecordTime": "2023-02-01T11:08:04.313047785+08:00",
              "Phase": "PushCommittedImage",
              "Message": "Push image registry-vpc.cn-beijing.aliyuncs.com/***-test/***-registry:1.0.1 successfully"
            }
          ],
          "CreationTime": "2023-02-01T11:08:00Z",
          "TaskStatus": "Succeeded",
          "FinishedTime": "2023-02-01T11:08:10Z"
        }
      ],
      "NextToken": "",
      "RequestId": "42E65299-8224-5D4A-915E-5AEC04A523FC"
    }

    此时,登录容器镜像服务控制台,在目标ACR镜像仓库中可以看到ECI推送的新的镜像。

    推送镜像.png

  5. 使用新的镜像重新创建一台ECI实例B。

    此处使用的镜像为CommitContainer任务推送到ACR的镜像,示例为registry-vpc.cn-beijing.aliyuncs.com/***-test/***-registry:1.0.1

    eci-commit2

    说明

    在选择镜像时,如果使用ACR个人版镜像仓库,请选择我的镜像;如果使用ACR企业版镜像仓库,请选择企业镜像

  6. 确认实例B中的容器环境与实例A的一致。

    示例中实例A的容器中增加了hello.txt文件,由于实例B采用了实例A生成的容器镜像,因此查看实例B的容器,可看到默认已存在hello.txt文件。

    eci-commit3