根据业务需求,启动ECI实例后,您可能需要在容器内部进行一些操作修改。如果您想要保留修改后的环境,可以将修改过的容器环境打包成镜像,并推送到ACR,以便后续可以使用。本文介绍如何通过CommitContainer和DescribeCommitContainerTask接口提交容器生成镜像并推送到ACR。
准备工作
创建ACR实例和镜像仓库,并获取镜像仓库地址。
关于如何创建ACR实例和镜像仓库,请参见以下文档:
创建成功后,从镜像仓库页面获取仓库地址。本文使用私网地址。
创建RAM角色并授权,然后获取角色的ARN。
创建RAM角色。
具体操作,请参见创建可信实体为阿里云服务的RAM角色。需要注意的配置如下:
在选择类型页面,可信实体类型选择阿里云服务。
在配置角色页面,角色类型选择普通服务角色,角色名称可以自定义输入,受信服务选择弹性容器实例ECI。
为RAM角色授权。
具体操作,请参见为RAM角色授权。授权时,请选择AliyunContainerRegistryFullAccess权限策略。
获取角色的ARN。
在角色详情页面的基本信息处可以获取ARN。
配置说明
调用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。
配置示例
创建一台ECI实例A。
连接ECI实例A,在容器内进行操作。
此处以在容器写入一个文件(hello.txt)作为示例。
调用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" }
调用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推送的新的镜像。
使用新的镜像重新创建一台ECI实例B。
此处使用的镜像为CommitContainer任务推送到ACR的镜像,示例为
registry-vpc.cn-beijing.aliyuncs.com/***-test/***-registry:1.0.1
。说明在选择镜像时,如果使用ACR个人版镜像仓库,请选择我的镜像;如果使用ACR企业版镜像仓库,请选择企业镜像。
确认实例B中的容器环境与实例A的一致。
示例中实例A的容器中增加了hello.txt文件,由于实例B采用了实例A生成的容器镜像,因此查看实例B的容器,可看到默认已存在hello.txt文件。