共用方式為


使用 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 傳輸疑難排解

下一步