使用 ARM 範本進行 ACR 傳輸
完成先決條件
請先完成此處所述的必要條件,再嘗試本文中的動作。 這表示:
- 您在兩個雲端中都有現有的進階版 SKU 登錄。
- 您有兩個雲端中現有的儲存體帳戶容器。
- 您有一個具有秘密的現有 Keyvault,其中包含在兩個雲端中具有必要權限的有效 SAS 權杖。
- 您已在兩個雲端中安裝最新版的 Az CLI。
重要
由於技術限制,ACR 傳輸支援成品層大小限制為 8 GB 的成品。
請考慮使用 Az CLI 延伸模組
針對大部分非自動化的使用案例,如果可能,我們建議使用 Az CLI 延伸模組。 您可以在這裡檢視 Az CLI 延伸模組的文件。
使用 Resource Manager 建立 ExportPipeline
使用 Azure Resource Manager 範本部署,為您的來源容器登錄建立 ExportPipeline 資源。
將 ExportPipeline Resource Manager 範本檔案複製到本地資料夾。
在檔案 azuredeploy.parameters.json
中輸入下列參數值:
參數 | 值 |
---|---|
registryName | 來源容器登錄的名稱 |
exportPipelineName | 您為匯出管線選擇的名稱 |
targetUri | 來源環境中的儲存體容器 URI (匯出管線的目標)。 範例: https://sourcestorage.blob.core.windows.net/transfer |
keyVaultName | 來源金鑰保存庫的名稱 |
sasTokenSecretName | 來源金鑰保存庫中 SAS 權杖祕密的名稱 範例:acrexportsas |
匯出選項
匯出管線的 options
屬性支援選擇性布林值。 以下為建議值:
參數 | 值 |
---|---|
電子商務選項中 | OverwriteBlobs - 覆寫現有的目標 blob ContinueOnErrors - 如果某個成品匯出失敗,請繼續匯出來源登錄中的剩餘成品。 |
建立資源
執行 az deployment group create 來建立名為 exportPipeline 的資源,如下列範例所示。 根據預設,使用第一個選項,範例範本會在 ExportPipeline 資源中啟用系統指派的身分識別。
使用第二個選項,您可以為資源提供使用者指派的身分識別。 (未顯示使用者指派身分識別的建立。)
使用任一選項時,範本會設定身分識別來存取匯出金鑰保存庫中的 SAS 權杖。
選項 1:建立資源並啟用系統指派的身分識別
az deployment group create \
--resource-group $SOURCE_RG \
--template-file azuredeploy.json \
--name exportPipeline \
--parameters azuredeploy.parameters.json
選項 2:建立資源並提供使用者指派的身分識別
在此命令中,提供使用者指派身分識別的資源識別碼做為其他參數。
az deployment group create \
--resource-group $SOURCE_RG \
--template-file azuredeploy.json \
--name exportPipeline \
--parameters azuredeploy.parameters.json \
--parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"
在命令輸出中,記下管線的資源識別碼 (id
)。 您可以執行 az deployment group show,將此值儲存在環境變數中以供稍後使用。 例如:
EXPORT_RES_ID=$(az deployment group show \
--resource-group $SOURCE_RG \
--name exportPipeline \
--query 'properties.outputResources[1].id' \
--output tsv)
使用 Resource Manager 建立 ImportPipeline
使用 Azure Resource Manager 範本部署,為您的目標容器登錄建立 ImportPipeline 資源。 根據預設,會在目標環境中的儲存體帳戶具有成品 Blob 時,啟用管線以自動匯入。
將 ImportPipeline Resource Manager 範本檔案複製到本地資料夾。
在檔案 azuredeploy.parameters.json
中輸入下列參數值:
參數 | 值 |
---|---|
registryName | 目標容器登錄的名稱 |
importPipelineName | 您為匯入管線選擇的名稱 |
sourceUri | 目標環境中的儲存體容器 URI (匯入管線的來源)。 範例: https://targetstorage.blob.core.windows.net/transfer |
keyVaultName | 目標金鑰保存庫的名稱 |
sasTokenSecretName | 目標金鑰保存庫中 SAS 權杖祕密的名稱 範例:acr importsas |
匯入選項
匯入管線的 options
屬性支援選擇性布林值。 以下為建議值:
參數 | 值 |
---|---|
電子商務選項中 | OverwriteTags - 覆寫現有的目標標籤 DeleteSourceBlobOnSuccess - 成功匯入目標登錄之後刪除來源儲存體 Blob ContinueOnErrors - 如果某個成品匯入失敗,請繼續匯入目標登錄中的剩餘成品。 |
建立資源
執行 az deployment group create 來建立名為 importPipeline 的資源,如下列範例所示。 根據預設,使用第一個選項,範例範本會在 ImportPipeline 資源中啟用系統指派的身分識別。
使用第二個選項,您可以為資源提供使用者指派的身分識別。 (未顯示使用者指派身分識別的建立。)
使用任一選項時,範本會設定身分識別來存取匯入金鑰保存庫中的 SAS 權杖。
選項 1:建立資源並啟用系統指派的身分識別
az deployment group create \
--resource-group $TARGET_RG \
--template-file azuredeploy.json \
--name importPipeline \
--parameters azuredeploy.parameters.json
選項 2:建立資源並提供使用者指派的身分識別
在此命令中,提供使用者指派身分識別的資源識別碼做為其他參數。
az deployment group create \
--resource-group $TARGET_RG \
--template-file azuredeploy.json \
--name importPipeline \
--parameters azuredeploy.parameters.json \
--parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"
如果您打算手動執行匯入,請記下管線的資源識別碼 (id
)。 您可以執行 az deployment group show 命令,將此值儲存在環境變數中以供稍後使用。 例如:
IMPORT_RES_ID=$(az deployment group show \
--resource-group $TARGET_RG \
--name importPipeline \
--query 'properties.outputResources[1].id' \
--output tsv)
使用 Resource Manager 建立 PipelineRun 以進行匯出
使用 Azure Resource Manager 範本部署,為您的來源容器登錄建立 PipelineRun 資源。 此資源會執行您先前建立的 ExportPipeline 資源,並將指定的成品以 Blob 的形式,從容器登錄匯出至來源儲存體帳戶。
將 PipelineRun Resource Manager 範本檔案複製到本地資料夾。
在檔案 azuredeploy.parameters.json
中輸入下列參數值:
參數 | 值 |
---|---|
registryName | 來源容器登錄的名稱 |
pipelineRunName | 您為執行選擇的名稱 |
pipelineResourceId | 匯出管線的資源識別碼。 範例: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline |
targetName | 您為匯出至來源儲存體帳戶的成品 Blob 選擇的名稱,例如 myblob |
artifacts | 要傳送的來源成品陣列,做為標籤或資訊清單摘要 範例: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."] |
如果重新部署具有相同屬性的 PipelineRun 資源,您也必須使用 forceUpdateTag 屬性。
執行 az deployment group create 以建立 PipelineRun 資源。 下列範例會將部署命名為 exportPipelineRun。
az deployment group create \
--resource-group $SOURCE_RG \
--template-file azuredeploy.json \
--name exportPipelineRun \
--parameters azuredeploy.parameters.json
為了稍後使用,請將管線執行的資源識別碼儲存在環境變數中:
EXPORT_RUN_RES_ID=$(az deployment group show \
--resource-group $SOURCE_RG \
--name exportPipelineRun \
--query 'properties.outputResources[0].id' \
--output tsv)
成品匯出可能需要幾分鐘的時間。 部署成功完成時,請在來源儲存體帳戶的傳輸容器中列出匯出的 Blob,以確認成品匯出。 例如,執行 az storage blob list 命令:
az storage blob list \
--account-name $SOURCE_SA \
--container transfer \
--output table
傳送 Blob (選用)
使用 AzCopy 工具或其他方法,將 Blob 資料從來源儲存體帳戶傳送至目標儲存體帳戶。
例如,下列 azcopy copy
命令會將 myblob 從來源帳戶中的傳輸容器複製到目標帳戶中的傳輸容器。 如果 Blob 存在於目標帳戶中,則會將其覆寫。 驗證會使用具有來源和目標容器適當權限的 SAS 權杖。 (不會顯示權杖的建立步驟。)
azcopy copy \
'https://<source-storage-account-name>.blob.core.windows.net/transfer/myblob'$SOURCE_SAS \
'https://<destination-storage-account-name>.blob.core.windows.net/transfer/myblob'$TARGET_SAS \
--overwrite true
觸發 ImportPipeline 資源
如果您啟用 ImportPipeline 的 sourceTriggerStatus
參數 (預設值),則會在 Blob 複製到目標儲存體帳戶之後觸發管線。 成品匯入可能需要幾分鐘的時間。 當匯入成功完成時,請在目標容器登錄中列出存放庫,以確認成品匯入。 例如,執行 az acr repository list:
az acr repository list --name <target-registry-name>
注意
來源觸發程序只會匯入過去 60 天內具有上次修改時間的 Blob。 如果您想要使用來源觸發程序,匯入早於該時間的 Blob,請將 Blob 中繼資料新增至 Blob,或使用手動建立的管線執行加以匯入,以重新整理 Blob 的上次修改時間。
如果您未啟用匯入管線的 sourceTriggerStatus
參數,請如下一節所示,手動執行 ImportPipeline 資源。
使用 Resource Manager 建立 PipelineRun 以進行匯入 (選用)
您也可以使用 PipelineRun 資源來觸發 ImportPipeline,以便將成品匯入至目標容器登錄。
將 PipelineRun Resource Manager 範本檔案複製到本地資料夾。
在檔案 azuredeploy.parameters.json
中輸入下列參數值:
參數 | 值 |
---|---|
registryName | 目標容器登錄的名稱 |
pipelineRunName | 您為執行選擇的名稱 |
pipelineResourceId | 匯入管線的資源識別碼。 範例: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/importPipelines/myImportPipeline |
sourceName | 儲存體帳戶中匯出成品的現有 Blob 名稱,例如 myblob |
如果重新部署具有相同屬性的 PipelineRun 資源,您也必須使用 forceUpdateTag 屬性。
執行 az deployment group create 以執行資源。
az deployment group create \
--resource-group $TARGET_RG \
--name importPipelineRun \
--template-file azuredeploy.json \
--parameters azuredeploy.parameters.json
為了稍後使用,請將管線執行的資源識別碼儲存在環境變數中:
IMPORT_RUN_RES_ID=$(az deployment group show \
--resource-group $TARGET_RG \
--name importPipelineRun \
--query 'properties.outputResources[0].id' \
--output tsv)
當部署成功完成時,請在目標容器登錄中列出存放庫,以確認成品匯入。 例如,執行 az acr repository list:
az acr repository list --name <target-registry-name>
重新部署 PipelineRun 資源
如果重新部署具有相同屬性的 PipelineRun 資源,您也必須使用 forceUpdateTag 屬性。 這個屬性表示即使設定尚未變更,也應該重新建立 PipelineRun 資源。 確定每次重新部署 PipelineRun 資源時 forceUpdateTag 都不同。 下列範例會重新建立 PipelineRun 以供匯出。 目前的日期時間是用來設定 forceUpdateTag,藉此確保此屬性一律是唯一的。
CURRENT_DATETIME=`date +"%Y-%m-%d:%T"`
az deployment group create \
--resource-group $SOURCE_RG \
--template-file azuredeploy.json \
--name exportPipelineRun \
--parameters azuredeploy.parameters.json \
--parameters forceUpdateTag=$CURRENT_DATETIME
刪除管線資源
下列範例命令會使用 az resource delete 來刪除本文中建立的管線資源。 資源識別碼先前儲存在環境變數中。
# Delete export resources
az resource delete \
--resource-group $SOURCE_RG \
--ids $EXPORT_RES_ID $EXPORT_RUN_RES_ID \
--api-version 2019-12-01-preview
# Delete import resources
az resource delete \
--resource-group $TARGET_RG \
--ids $IMPORT_RES_ID $IMPORT_RUN_RES_ID \
--api-version 2019-12-01-preview
ACR 傳輸疑難排解
如需疑難排解指導,請檢視 ACR 傳輸疑難排解。
下一步
- 瞭解如何防止從網路限制容器登錄建立匯出管線。