根據業務需求,啟動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 | 授權類型??膳渲脼閟ervice,表示使用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文件。