從 Container Registry 遷移至 Artifact Registry 時,您可以複製要保留在 Artifact Registry 中的 Container Registry 映像檔。
總覽
您可以透過多種方式將映像檔從 Container Registry 複製到 Artifact Registry。建議您使用自動遷移工具複製圖片,因為這項工具支援複製多個專案、即使您已啟用重新導向功能也能複製圖片,且可處理的圖片數量比其他方法多。
如要降低成本,請採取下列做法:
請先移除舊的未標記映像檔,再將容器複製到 Artifact Registry。
如果您要將圖片複製到標準 (
pkg.dev
) Artifact Registry 存放區,請先停用 Artifact Registry 的自動掃描功能,再複製圖片,以免重複產生掃描費用。複製所有圖片後,您可以重新啟用自動掃描功能。如果您將圖片複製到 Artifact Registry 上的
gcr.io
存放區,則不需要停用自動掃描功能。如要進一步瞭解如何控管安全漏洞掃描相關費用,請參閱「控管安全漏洞掃描費用」。
從 Container Registry 移除未標記的映像檔
移除未標記的映像檔,可降低 Container Registry 中的儲存空間成本,以及從 Container Registry 複製至 Artifact Registry 的映像檔成本。
您可以使用多種工具,自動識別並移除不再需要的圖片。舉例來說,gcr-cleaner 工具可協助您根據不同條件找出並移除舊圖片。gcr-cleaner
工具並非 Google 官方產品。
如要進一步瞭解如何設定及使用這項工具,請參閱 gcr-cleaner 說明文件。
使用自動遷移工具複製圖片 (建議)
使用自動遷移工具,從 Container Registry 遷移至 Artifact Registry 上的 gcr.io
存放區或標準 Artifact Registry 存放區,或是將映像檔從 Container Registry 複製到 Artifact Registry。
這項工具僅支援遷移至相同多區域。
請按照「自動遷移至 Artifact Registry」一文中的指示,將映像檔從 Container Registry 複製到 Artifact Registry。
使用 gcrane 複製圖片
如要將圖片複製到 Artifact Registry,您也可以使用 gcrane
工具。
gcrane
可在多個區域之間複製圖片,但有以下缺點:
gcrane
的速度比自動化工具慢。gcrane
受限於 Container Registry 配額。- 如果任何圖片的版本或標記超過 10,000 個,
gcrane
可能會失敗。 - 如果任何圖片設定錯誤或缺少資料,
gcrane
可能會失敗。
需求條件
請確認符合下列規定:
您已在來源和目的地 Google Cloud 專案中啟用 Artifact Registry。
您已在 Artifact Registry 中建立 Docker 存放區,用於複製的映像檔。
您具備必要權限:
Storage Object Viewer (
roles/storage.objectViewer
) 或具有 Container Registry 主機儲存空間值區等同權限的角色。瞭解如何授予這些權限。Artifact Registry 寫入者 (
roles/artifactregistry.writer
),或是具有 Artifact Registry 存放區等同權限的角色。瞭解如何授予這些權限。
如要使用快速複製選項,請確認符合下列規定:
您必須使用 gcrane 0.10.0 以上版本。本文件中的 gcrane 設定說明包含下載最新版本的步驟。
如要檢查現有 gcrane 安裝版本,請執行下列指令:
gcrane version
目的地專案的 Artifact Registry 服務代理必須具備 Storage 物件檢視者 (
roles/storage.objectViewer
) 角色,或是在來源專案中具備同等權限的角色。執行下列指令,將「Storage 物件檢視者」角色授予服務代理人:gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID \ --member='serviceAccount:service-DEST_PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com' \ --role='roles/storage.objectViewer'
將
SOURCE_PROJECT_ID
替換為具有容器註冊服務主機的 Google Cloud專案 ID (例如「my-project」)。將
DEST_PROJECT_NUMBER
替換為 Artifact Registry 存放區中 Google Cloud 專案的編號 (例如 12345)。
環境選項和費用
您可以在多個環境中執行 gcrane
:
Compute Engine 執行個體:如果要複製的容器數量較多,請使用這個選項。
費用:
- Compute Engine VM 的執行個體正常運作時間。
- 網路資料移轉:複製圖片時會產生網路資料移轉,除非您使用快速複製選項。如何盡量降低成本:
- 使用與容器註冊儲存空間值區相同位置的 VM 執行個體。
- 如要降低成本並提高複製速度,請使用與 Container Registry 位於相同多區域的 Artifact Registry 存放區。在同一個多區域內轉移資料不會產生費用,而且速度比跨區域複製快上許多。
Cloud Shell:可用於複製約 40 GB 以下的小型資料集。由於
gcrane
會略過已上傳的圖層,因此這項限制適用於您要複製的新資料。複製較大的存放區可能會導致 Cloud Shell 在要求逾時時間 (10 分鐘) 後中斷連線。
費用:複製圖片的網路資料移轉費用 (除非你使用快速複製選項)。
- 您無法選擇 Cloud Shell 工作階段的位置。如要檢查目前工作階段的位置,請執行下列指令:
curl metadata/computeMetadata/v1/instance/zone
- 如要降低成本並提高複製速度,請使用與 Container Registry 位於相同多區域的 Artifact Registry 存放區。在同一個多區域內轉移資料不會產生費用,而且速度比跨區域複製快上許多。
本機電腦:如果您無法使用其他選項,可以從本機電腦執行
gcrane
。費用:複製圖片的網路資料傳輸費用 (除非你使用快速複製選項)
如要降低成本並提高複製速度,請使用與 Container Registry 位於相同多區域的 Artifact Registry 存放區。在同一個多區域內轉移資料不會產生費用,而且速度比跨區域複製快上許多。
設定 Compute Engine
如要從 Compute Engine VM 執行個體複製含有 gcrane
的映像檔,請按照下列步驟操作:
- 建立 VM 執行個體。為降低成本,請在與複製來源相同的位置建立執行個體。
根據預設,VM 執行個體會與預設服務帳戶建立關聯,並具備提取映像檔的權限。您必須變更存取權範圍,才能讓 VM 執行個體推送映像檔。
停止 VM 執行個體。請參閱「停止執行個體」一文。
使用下列指令變更存取權範圍:
gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
將 INSTANCE 替換為 VM 執行個體的名稱。
重新啟動 VM 執行個體。請參閱啟動已停止的執行個體。
使用 SSH 連線至 VM 執行個體。
執行下列指令,下載
gcrane
。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
執行下列指令,將
gcrane
指令設為可執行。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
執行
gcrane --help
指令來驗證安裝作業。
您現在可以複製圖片了。如要繼續操作,請按照下列步驟操作:
設定 Cloud Shell
開啟 Cloud Shell 視窗。
設定預設專案。將 PROJECT 替換為安裝 Container Registry 和 Artifact Registry 的專案 ID
gcloud config set project PROJECT
執行下列指令,下載
gcrane
工具。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
執行下列指令,將
gcrane
指令設為可執行。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
執行
gcrane --help
指令來驗證安裝作業。
您現在可以複製圖片了。如要繼續操作,請按照下列步驟操作:
設定本機
從 GitHub 存放區下載
gcrane
。例如,下列指令會從指令列下載 Linux x86-64 發行版。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
執行下列指令,將
gcrane
指令設為可執行。這些指令假設下載的檔案名稱為go-containerregistry.tar.gz
。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
執行
gcrane --help
指令來驗證安裝作業。
您現在可以複製圖片了。如要繼續操作,請按照下列步驟操作:
找出要複製的圖片
安裝 gcrane 後,您可以列出 Container Registry 中的現有映像檔,找出要複製的映像檔。
如要列出現有映像檔,請執行下列指令:
gcrane ls LOCATION.gcr.io/PROJECT
如要列出映像檔的標記,請執行下列指令:
gcrane ls LOCATION.gcr.io/PROJECT/IMAGE
如要以遞迴方式列出特定路徑下的圖片,請執行下列指令:
gcrane ls -r LOCATION.gcr.io/PROJECT/PATH
針對每個指令:
- 將
LOCATION
替換為註冊服務的多區域:asia
、eu
或us
。 - 將
PROJECT
替換為專案 ID。
如要瞭解如何複製圖片,請參閱「複製圖片」一節。
複製圖片
您可以從 Container Registry 複製個別映像檔、某個位置指定路徑下的所有映像檔,或是儲存在某個位置的所有映像檔。
複製單張圖片
如要複製單一標記的映像檔,請執行下列指令:
gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE
地點
- GCR-LOCATION 是 Container Registry 主機的多區域:
asia
、eu
或us
。 - AR-LOCATION 是存放區的區域或多區域。
- PROJECT 是專案 ID。
- REPOSITORY 是 Artifact Registry 存放區的名稱。
- GCR-IMAGE 是您要從 Container Registry 複製的映像檔。
- AR-IMAGE 是 Artifact Registry 中的映像檔名稱。
舉例來說,請參考以下來源和目標圖片:
- Container Registry 映像檔:
eu.gcr.io/my-project/my-image:tag1
- Artifact Registry 映像檔:
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1
執行下列指令來複製映像檔:
gcrane cp eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1
複製路徑下方的所有圖片
如要遞迴複製 Container Registry 中特定路徑下的映像檔,請執行下列指令:
gcrane cp -r GCR-LOCATION.gcr.io/PROJECT/GCR-PATH \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/AR-PATH
地點
- GCR-LOCATION 是 Container Registry 主機的多區域:
asia
、eu
或us
。 - AR-LOCATION 是存放區的區域或多區域。
- PROJECT 是專案 ID。
- REPOSITORY 是 Artifact Registry 存放區的名稱。
- GCR-PATH 是您要複製的檔案路徑。
- AR-PATH 是 Artifact Registry 存放區中映像檔的路徑。
舉例來說,請考量以下來源和目的地路徑:
- Container Registry 路徑:
eu.gcr.io/my-project/test-images/testing
- Artifact Registry 路徑:
europe-docker.pkg.dev/my-project/my-repo/test-images/testing
下列指令會以遞迴方式將 test-images/testing
底下的所有圖片複製到 my-repo
存放區:
gcrane cp -r eu.gcr.io/my-project/test-images/testing \
europe-docker.pkg.dev/my-project/my-repo/test-images/testing
從 Container Registry 位置複製所有映像檔
如要從 Container Registry 多區域複製所有映像檔,請執行下列指令:
gcrane cp -r GCR-LOCATION.gcr.io/PROJECT \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY
地點
- GCR-LOCATION 是 Container Registry 主機的多區域:
asia
、eu
或us
。 - AR-LOCATION 是存放區的區域或多區域。
- PROJECT 是專案 ID。
- REPOSITORY 是 Artifact Registry 存放區的名稱。
如果您想在專案中為多個 Container Registry 位置複製映像檔,請為每個主機執行一次指令。
舉例來說,請考量下列來源登錄和目標 Artifact Registry 存放區。在本例中,Container Registry 和 Artifact Registry 位於不同的專案中。
- Container Registry 主機:
eu.gcr.io/my-project
- Artifact Registry 映像檔:
europe-docker.pkg.dev/new-project/my-repo
下列指令會將所有映像檔從專案 my-project
的 eu
多地區複製到專案 new-project
的 my-repo
存放區。
gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo
使用 Docker 複製映像檔
與 gcrane 和 gcloud 複製方法不同,這個方法是兩步驟程序。
- 從 Container Registry 提取映像檔
- 將映像檔推送至 Artifact Registry 存放區。
需求條件
請確認符合下列規定:
您已在 Artifact Registry 中建立 Docker 存放區,用於複製的映像檔。
您具備必要權限:
Storage Object Viewer (
roles/storage.objectViewer
) 或具有 Container Registry 主機儲存空間值區等同權限的角色。瞭解如何授予這些權限。Artifact Registry 寫入者 (
roles/artifactregistry.writer
),或是具有 Artifact Registry 存放區等同權限的角色。瞭解如何授予這些權限。
您已將 Docker 設為向 Container Registry 和 Artifact Registry 進行驗證。
費用
您在提取圖片時,系統會向您收取網路資料傳輸費用。具體價格取決於拉取指令的目的。舉例來說,如果您從 Cloud Shell 工作階段提取圖片,系統會依據 Google Cloud內的網路資料移轉費用收費。如果您將映像檔拉至 Google Cloud以外的機器,則適用一般網路資料移轉的定價。
在 Artifact Registry 中標記、推送及提取映像檔的 Docker 指令,與在 Container Registry 中使用的指令類似。兩者的主要差異如下:
- Artifact Registry Docker 存放區的主機名稱包含位置前置字串,後面接著
-docker.pkg.dev
。例如australia-southeast1-docker.pkg.dev
、europe-north1-docker.pkg.dev
和europe-docker.pkg.dev
。 - 由於 Artifact Registry 支援單一專案中的多個 Docker 存放區,因此您必須在指令中指定存放區名稱。
如要使用 Docker 將映像檔複製到 Artifact Registry,請從 Container Registry 提取映像檔,然後推送至 Artifact Registry 存放區。
舉例來說,假設您有一個位於 eu
多地區的 Container Registry 映像檔,而您想將該映像檔複製到 europe
區域的 Artifact Registry 存放區。
- Container Registry 映像檔:
eu.gcr.io/my-project/my-image:tag1
- Artifact Registry 映像檔:
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1
下列指令會從 Container Registry 提取映像檔。
docker pull eu.gcr.io/my-project/my-image:tag1
下列指令會將映像檔推送至名為 my-repo
的 Artifact Registry 存放區。
docker push europe-north1-docker.pkg.dev/my-project/my-repo/my-image
您也可以將圖片推送至在其他專案中設定的 Artifact Registry 存放區。這個範例會將相同的來源圖片推送至專案 new-project
中的存放區 my-repo
。
docker push europe-north1-docker.pkg.dev/new-project/my-repo/my-image
如要進一步瞭解如何在 Artifact Registry 中推送及提取映像檔,請參閱「推送及提取映像檔」。
使用 gcloud 複製圖片
使用 gcloud container images add-tag
指令,將映像檔從 Container Registry 複製到 Artifact Registry 存放區。
需求條件
請確認符合下列規定:
您已在 Artifact Registry 中建立 Docker 存放區,用於複製的映像檔。
您具備必要權限:
Storage Object Viewer (
roles/storage.objectViewer
) 或具有 Container Registry 主機儲存空間值區等同權限的角色。瞭解如何授予這些權限。Artifact Registry 寫入者 (
roles/artifactregistry.writer
),或是具有 Artifact Registry 存放區等同權限的角色。瞭解如何授予這些權限。
費用
如果 Container Registry 與 Artifact Registry 存放區位於不同位置,則會針對您複製的映像檔收取網路資料移轉費用。如果兩項服務位於相同位置,網路資料傳輸作業就不會產生費用。
執行下列指令,將映像檔從 Container Registry 複製到 Artifact Registry:
gcloud container images add-tag GCR-IMAGE AR-IMAGE
地點
- GCR-IMAGE 是 Container Registry 映像檔的完整路徑。
- AR-IMAGE 是 Artifact Registry 存放區中映像檔的完整路徑。
舉例來說,請參考以下來源和目標圖片:
- Container Registry 映像檔:
eu.gcr.io/my-project/my-image:tag1
- Artifact Registry 映像檔:
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1
這個指令會將映像檔從多區域 eu
中的 Container Registry 複製至多區域 europe
中的存放區 my-repo
。
gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1
您也可以將圖片複製到在其他專案中設定的 Artifact Registry 存放區。這個範例會將相同的來源圖片複製到專案 new-project
中的存放區 my-repo
。
gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/new-project/my-repo/my-image:tag1
後續步驟
- 進一步瞭解如何從 Container Registry 遷移至 Artifact Registry,包括功能和 gcloud CLI 指令的比較。
- 瞭解 Docker 異動。
- 瞭解在 Google Cloud中建構及部署內容的相關異動。