選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

遷移至 Amazon ECR 儲存庫時,自動識別重複的容器映像 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

遷移至 Amazon ECR 儲存庫時,自動識別重複的容器映像

由 Rishabh Yadav (AWS) 和 Rishi Singla (AWS) 建立

Summary

注意: AWS CodeCommit 不再提供給新客戶。的現有客戶 AWS CodeCommit 可以繼續正常使用服務。進一步了解

此模式提供自動化解決方案,以識別存放在不同容器儲存庫中的映像是否為重複。當您計劃將映像從其他容器儲存庫遷移到 Amazon Elastic Container Registry (Amazon ECR) 時,此檢查很有用。

如需基礎資訊,模式也會說明容器映像的元件,例如映像摘要、資訊清單和標籤。當您計劃遷移至 Amazon ECR 時,您可以比較映像摘要,以決定跨容器登錄檔同步容器映像。遷移容器映像之前,您需要檢查 Amazon ECR 儲存庫中是否已存在這些映像,以防止重複。不過,比較映像摘要可能很難偵測重複,這可能會導致初始遷移階段的問題。 此模式會比較存放在不同容器登錄檔中的兩個類似影像的摘要,並說明摘要為何不同,以協助您準確比較影像。

先決條件和限制

架構

容器映像元件

下圖說明容器映像的一些元件。這些元件會在圖表後說明。

資訊清單、組態、檔案系統層和摘要。

術語和定義

下列詞彙在開放容器計劃 (OCI) 影像規格中定義。

  • 登錄檔:映像儲存和管理的服務。

  • 用戶端:與 登錄檔通訊並搭配本機映像使用的工具。

  • 推送:將映像上傳至登錄檔的程序。

  • 提取:從登錄檔下載映像的程序。

  • Blob:由登錄檔存放且可由摘要處理之內容的二進位形式。

  • 索引:識別不同電腦平台 (例如 x86-64 或 ARM 64 位元) 或媒體類型的多個影像清單的建構。如需詳細資訊,請參閱 OCI 影像索引規格

  • 資訊清單:定義透過資訊清單端點上傳之影像或成品的 JSON 文件。資訊清單可以使用描述項來參考儲存庫中的其他 Blob。如需詳細資訊,請參閱 OCI Image Manifest 規格

  • 檔案系統層:系統程式庫和其他映像的相依性。

  • 組態:包含成品中繼資料並在資訊清單中參考的 Blob。如需詳細資訊,請參閱 OCI Image Configuration Specification

  • 物件或成品:存放在 Blob 中的概念內容項目,並與具有組態的隨附資訊清單相關聯。

  • 摘要:從資訊清單內容的密碼編譯雜湊建立的唯一識別符。映像摘要有助於唯一識別不可變的容器映像。當您使用映像摘要提取映像時,每次在任何作業系統或架構上都會下載相同的映像。如需詳細資訊,請參閱 OCI Image Specification

  • 標籤:人類可讀取的資訊清單識別符。相較於不可變的影像摘要,標籤是動態的。指向影像的標籤可以變更,並從一個影像移動到另一個影像,但基礎影像摘要保持不變。

目標架構

下圖顯示此模式所提供解決方案的高階架構,透過比較存放在 Amazon ECR 和私有儲存庫中的映像來識別重複的容器映像。

使用 CodePipeline 和 CodeBuild 自動偵測重複項目。

工具

AWS 服務

  • AWS CloudFormation 可協助您設定 AWS 資源、快速且一致地佈建資源,以及在整個 AWS 帳戶 和 區域的生命週期中管理資源。

  • AWS CodeBuild是一種全受管建置服務,可協助您編譯原始程式碼、執行單位測試,並產生準備好部署的成品。

  • AWS CodeCommit 是一種版本控制服務,可協助您私下存放和管理 Git 儲存庫,而無需管理您自己的來源控制系統。

  • AWS CodePipeline 可協助您快速建模和設定軟體版本的不同階段,並自動化持續發行軟體變更所需的步驟。

  • Amazon Elastic Container Registry (Amazon ECR) 是一種受管容器映像登錄服務,安全、可擴展且可靠。

程式碼

此模式的程式碼可在 GitHub 儲存庫中取得 自動解決方案,以識別儲存庫之間的重複容器映像

最佳實務

史詩

任務描述所需的技能

從 Amazon ECR 公有儲存庫中提取映像。

從終端機執行下列命令,amazonlinux從 Amazon ECR 公有儲存庫中提取映像。

$~ % docker pull public.ecr.aws/amazonlinux/amazonlinux:2018.03

將映像提取至本機機器後,您會看到下列提取摘要,其代表映像索引。

2018.03: Pulling from amazonlinux/amazonlinux 4ddc0f8d367f: Pull complete Digest: sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5 Status: Downloaded newer image for public.ecr.aws/amazonlinux/amazonlinux:2018.03 public.ecr.aws/amazonlinux/amazonlinux:2018.03
應用程式開發人員、AWS DevOps、AWS 管理員

將映像推送至 Amazon ECR 私有儲存庫。

  1. 在美國東部 (維吉尼亞北部) 區域 () test_ecr_repository建立名為 的私有 Amazon ECR us-east-1儲存庫。

    $~ % aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com Login Succeeded

    其中 <account-id>是指您的 AWS 帳戶。

  2. 標記您先前提取的本機映像。使用 值並將其public.ecr.aws/amazonlinux/amazonlinux:2018.03推送至 Amazon ECR 私有儲存庫。

    $~ % docker tag public.ecr.aws/amazonlinux/amazonlinux:2018.03 <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest $~ % docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    當您將映像推送到 Amazon ECR 儲存庫時,Docker 將推送基礎映像,而不是映像索引。

    The push refers to repository [<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository] d5655967c2c4: Pushed latest: digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 size: 529
AWS 管理員、AWS DevOps、應用程式開發人員

從 Amazon ECR 私有儲存庫中提取相同的映像。

  1. 從終端機執行下列命令,以提取您先前推送到 Amazon ECR 私有儲存庫的映像。

    $~ % docker pull <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest latest: Pulling from test_ecr_repository Digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 Status: Image is up to date for <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    此映像的摘要符合您推送至 Amazon ECR 私有儲存庫的映像摘要,並代表基礎映像。此值與您從公有儲存庫提取的影像索引不相符。

  2. 若要驗證,請透過摘要擷取影像索引。 

    curl -k -H “Authorization: Bearer $TOKEN” https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b55 { “schemaVersion”: 2, “mediaType”: “application/vnd.docker.distribution.manifest.list.v2+json”, “manifests”: [ { “mediaType”: “application/vnd.docker.distribution.manifest.v2+json”, “size”: 529, “digest”: “sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", “platform”: { “architecture”: “amd64”, “os”: “linux” } } ] }
應用程式開發人員、AWS DevOps、AWS 管理員

從 Amazon ECR 公有和私有儲存庫提取容器映像

任務描述所需的技能

從 Amazon ECR 公有儲存庫中提取映像。

從終端機執行下列命令,amazonlinux從 Amazon ECR 公有儲存庫中提取映像。

$~ % docker pull public.ecr.aws/amazonlinux/amazonlinux:2018.03

將映像提取至本機機器後,您會看到下列提取摘要,其代表映像索引。

2018.03: Pulling from amazonlinux/amazonlinux 4ddc0f8d367f: Pull complete Digest: sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5 Status: Downloaded newer image for public.ecr.aws/amazonlinux/amazonlinux:2018.03 public.ecr.aws/amazonlinux/amazonlinux:2018.03
應用程式開發人員、AWS DevOps、AWS 管理員

將映像推送至 Amazon ECR 私有儲存庫。

  1. 在美國東部 (維吉尼亞北部) 區域 () test_ecr_repository建立名為 的私有 Amazon ECR us-east-1儲存庫。

    $~ % aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com Login Succeeded

    其中 <account-id>是指您的 AWS 帳戶。

  2. 標記您先前提取的本機映像。使用 值並將其public.ecr.aws/amazonlinux/amazonlinux:2018.03推送至 Amazon ECR 私有儲存庫。

    $~ % docker tag public.ecr.aws/amazonlinux/amazonlinux:2018.03 <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest $~ % docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    當您將映像推送到 Amazon ECR 儲存庫時,Docker 將推送基礎映像,而不是映像索引。

    The push refers to repository [<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository] d5655967c2c4: Pushed latest: digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 size: 529
AWS 管理員、AWS DevOps、應用程式開發人員

從 Amazon ECR 私有儲存庫中提取相同的映像。

  1. 從終端機執行下列命令,以提取您先前推送到 Amazon ECR 私有儲存庫的映像。

    $~ % docker pull <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest latest: Pulling from test_ecr_repository Digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 Status: Image is up to date for <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    此映像的摘要符合您推送至 Amazon ECR 私有儲存庫的映像摘要,並代表基礎映像。此值與您從公有儲存庫提取的影像索引不相符。

  2. 若要驗證,請透過摘要擷取影像索引。 

    curl -k -H “Authorization: Bearer $TOKEN” https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b55 { “schemaVersion”: 2, “mediaType”: “application/vnd.docker.distribution.manifest.list.v2+json”, “manifests”: [ { “mediaType”: “application/vnd.docker.distribution.manifest.v2+json”, “size”: 529, “digest”: “sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", “platform”: { “architecture”: “amd64”, “os”: “linux” } } ] }
應用程式開發人員、AWS DevOps、AWS 管理員
任務描述所需的技能

尋找存放在 Amazon ECR 公有儲存庫中的映像資訊清單。

從終端機執行下列命令,public.ecr.aws/amazonlinux/amazonlinux:2018.03從 Amazon ECR 公有儲存庫提取映像資訊清單。

$~ % docker manifest inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03 { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 529, "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "platform": { "architecture": "amd64", "os": "linux" } } ] }
AWS 管理員、AWS DevOps、應用程式開發人員

尋找存放在 Amazon ECR 私有儲存庫中的映像資訊清單。

從終端機執行下列命令,<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest從 Amazon ECR 私有儲存庫提取映像資訊清單。

$~ % docker manifest inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1477, "digest": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 62267075, "digest": "sha256:4ddc0f8d367f424871a060e2067749f32bd36a91085e714dcb159952f2d71453" } ] }
AWS DevOps、AWS 系統管理員、應用程式開發人員

比較 Docker 提取的摘要與 Amazon ECR 私有儲存庫中映像的資訊清單摘要。

另一個問題是為什麼 docker pull 命令提供的摘要與影像 的資訊清單摘要不同<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

用於 docker pull 的摘要代表影像資訊清單的摘要,存放在登錄檔中。此摘要被視為雜湊鏈的根目錄,因為資訊清單包含將下載並匯入 Docker 的內容雜湊。

Docker 中使用的映像 ID 可在此資訊清單中找到,名稱為 config.digest。這表示 Docker 使用的映像組態。因此,您可以說資訊清單是信封,而影像是信封的內容。資訊清單摘要一律與影像 ID 不同。不過,特定資訊清單應一律產生相同的影像 ID。由於資訊清單摘要是雜湊鏈,我們無法保證指定影像 ID 永遠相同。在大多數情況下,它會產生相同的摘要,但 Docker 無法保證這一點。資訊清單摘要的可能差異源於 Docker 不會存放本機使用 gzip 壓縮的 Blob。因此,匯出層可能會產生不同的摘要,但未壓縮的內容保持不變。映像 ID 會驗證未壓縮的內容是否相同;也就是說,映像 ID 現在是內容可定址識別符 (chainID)。

若要確認此資訊,您可以比較 Amazon ECR 公有和私有儲存庫上 docker inspect 命令的輸出:

  1. 針對存放在 Amazon ECR 公有儲存庫中的映像,從您的終端機執行下列命令。

    $~ % docker inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03

    如需 命令的輸出,請參閱其他資訊一節。

  2. 針對存放在 Amazon ECR 私有儲存庫中的映像,從您的終端機執行下列命令。

    $~ % docker inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    如需 命令的輸出,請參閱其他資訊一節。

結果會驗證兩個影像具有相同的影像 ID 摘要和圖層摘要。

ID: f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68

圖層: d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2

此外,摘要是根據本機受管物件的位元組 (本機檔案是容器映像層的 tar) 或推送至登錄伺服器的 Blob。不過,當您將 Blob 推送至登錄檔時,會壓縮 tar,並在壓縮的 tar 檔案中計算摘要。因此,Docker 提取摘要值的差異來自套用至登錄檔 (Amazon ECR 私有或公有) 層級的壓縮。

注意

此說明專屬於使用 Docker 用戶端。您不會在其他用戶端看到此行為,例如 nerdctlFinch,因為它們不會在推送和提取操作期間自動壓縮映像。

AWS DevOps、AWS 系統管理員、應用程式開發人員

比較影像資訊清單

任務描述所需的技能

尋找存放在 Amazon ECR 公有儲存庫中的映像資訊清單。

從終端機執行下列命令,public.ecr.aws/amazonlinux/amazonlinux:2018.03從 Amazon ECR 公有儲存庫提取映像資訊清單。

$~ % docker manifest inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03 { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 529, "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "platform": { "architecture": "amd64", "os": "linux" } } ] }
AWS 管理員、AWS DevOps、應用程式開發人員

尋找存放在 Amazon ECR 私有儲存庫中的映像資訊清單。

從終端機執行下列命令,<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest從 Amazon ECR 私有儲存庫提取映像資訊清單。

$~ % docker manifest inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1477, "digest": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 62267075, "digest": "sha256:4ddc0f8d367f424871a060e2067749f32bd36a91085e714dcb159952f2d71453" } ] }
AWS DevOps、AWS 系統管理員、應用程式開發人員

比較 Docker 提取的摘要與 Amazon ECR 私有儲存庫中映像的資訊清單摘要。

另一個問題是為什麼 docker pull 命令提供的摘要與影像 的資訊清單摘要不同<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

用於 docker pull 的摘要代表影像資訊清單的摘要,存放在登錄檔中。此摘要被視為雜湊鏈的根目錄,因為資訊清單包含將下載並匯入 Docker 的內容雜湊。

Docker 中使用的映像 ID 可在此資訊清單中找到,名稱為 config.digest。這表示 Docker 使用的映像組態。因此,您可以說資訊清單是信封,而影像是信封的內容。資訊清單摘要一律與影像 ID 不同。不過,特定資訊清單應一律產生相同的影像 ID。由於資訊清單摘要是雜湊鏈,我們無法保證指定影像 ID 永遠相同。在大多數情況下,它會產生相同的摘要,但 Docker 無法保證這一點。資訊清單摘要的可能差異源於 Docker 不會存放本機使用 gzip 壓縮的 Blob。因此,匯出層可能會產生不同的摘要,但未壓縮的內容保持不變。映像 ID 會驗證未壓縮的內容是否相同;也就是說,映像 ID 現在是內容可定址識別符 (chainID)。

若要確認此資訊,您可以比較 Amazon ECR 公有和私有儲存庫上 docker inspect 命令的輸出:

  1. 針對存放在 Amazon ECR 公有儲存庫中的映像,從您的終端機執行下列命令。

    $~ % docker inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03

    如需 命令的輸出,請參閱其他資訊一節。

  2. 針對存放在 Amazon ECR 私有儲存庫中的映像,從您的終端機執行下列命令。

    $~ % docker inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    如需 命令的輸出,請參閱其他資訊一節。

結果會驗證兩個影像具有相同的影像 ID 摘要和圖層摘要。

ID: f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68

圖層: d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2

此外,摘要是根據本機受管物件的位元組 (本機檔案是容器映像層的 tar) 或推送至登錄伺服器的 Blob。不過,當您將 Blob 推送至登錄檔時,會壓縮 tar,並在壓縮的 tar 檔案中計算摘要。因此,Docker 提取摘要值的差異來自套用至登錄檔 (Amazon ECR 私有或公有) 層級的壓縮。

注意

此說明專屬於使用 Docker 用戶端。您不會在其他用戶端看到此行為,例如 nerdctlFinch,因為它們不會在推送和提取操作期間自動壓縮映像。

AWS DevOps、AWS 系統管理員、應用程式開發人員
任務描述所需的技能

複製儲存庫。

將此模式的 Github 儲存庫複製到本機資料夾:

$git clone https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories
AWS 管理員、AWS DevOps

設定 CI/CD 管道。

GitHub 儲存庫包含一個.yaml檔案,可建立 AWS CloudFormation 堆疊以在其中設定管道 AWS CodePipeline。

  1. 登入 AWS Management Console 並開啟 AWS CloudFormation 主控台

  2. 使用範本pipeline.yaml檔案建立堆疊,該檔案位於複製儲存庫的 code 資料夾中。

  3. 接受或變更參數的預設值。為下列項目指定值:

    • Stack name (堆疊名稱)

    • ArtifactStoreBucketName – 用來存放 AWS CodePipeline 成品的現有 S3 儲存貯體

    • OutputBucket – 現有的 S3 儲存貯體,用來存放重複映像URIs

    • SourceImageFile – 名為 的現有文字檔案input.txt,其中包含來自公有儲存庫的映像 URIs,該檔案會針對 Amazon ECR 私有儲存庫進行檢查,以偵測重複

  4. 檢閱和調整堆疊選項,然後選擇提交以執行範本。

管道將設定兩個階段 (CodeCommit 和 CodeBuild,如架構圖表所示),以識別私有儲存庫中也存在於公有儲存庫中的映像。管道使用下列資源設定:

  • 用於協調部署管道的 CodePipeline。

  • 儲存 bash 指令碼和輸入檔案的 CodeCommit 儲存庫。bash 指令碼用於比較公有和私有儲存庫中的容器映像 IDs,以尋找重複項目。此檢查會在單一 中指定的所有儲存庫 AWS 帳戶 中執行 AWS 區域。

  • CodeBuild 專案會叫用 bash 指令碼,以識別已存在於 Amazon ECR 儲存庫中的映像。

  • 允許存取的必要 IAM 角色。

  • 儲存包含映像 URIs 的輸出檔案的 S3 儲存貯體。

  • 另一個儲存 CodePipeline 成品的 S3 儲存貯體。 

AWS 管理員、AWS DevOps

填入 CodeCommit 儲存庫。

若要填入 CodeCommit 儲存庫,請執行下列步驟:

  1. 開啟 CodeCommit 主控台,並導覽至 AWS 區域 您建立 CloudFormation 堆疊的 。

  2. 從清單中尋找您使用 CloudFormation 指令碼佈建的儲存庫,選擇複製 URL,然後複製 HTTPS URL 通訊協定以連線至儲存庫。

  3. 開啟命令提示,並使用您在上一個步驟中複製的 HTTPS URL 執行 git 複製命令。

  4. 導覽至根目錄。建立名為 的檔案,input.txt 並將您要在私有 Amazon ECR 儲存庫中搜尋的 Amazon ECR 公有映像登錄 URIs 填入此檔案。

  5. 從 GitHub script.sh儲存庫的input.txt本機複本複製檔案 buildspec.yml、 和 自動解決方案,以識別儲存庫與複製的 CodeCommit 儲存庫之間的重複容器映像。 CodeCommit

  6. 使用以下命令將檔案上傳至 CodeCommit:

    git add . git commit -m “added input files” git push
AWS 管理員、AWS DevOps

清除。

若要避免產生未來的費用,請依照下列步驟刪除資源:

  1. 導覽至存放 CodePipeline 成品的 S3 儲存貯體,然後清空儲存貯體。

  2. 導覽至存放重複映像 URIs的 S3 儲存貯體,然後清空儲存貯體。

  3. 導覽至 CloudFormation 主控台,並刪除您建立來設定管道的堆疊。

AWS 管理員

自動識別 Amazon ECR 公有和私有儲存庫之間的重複映像

任務描述所需的技能

複製儲存庫。

將此模式的 Github 儲存庫複製到本機資料夾:

$git clone https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories
AWS 管理員、AWS DevOps

設定 CI/CD 管道。

GitHub 儲存庫包含一個.yaml檔案,可建立 AWS CloudFormation 堆疊以在其中設定管道 AWS CodePipeline。

  1. 登入 AWS Management Console 並開啟 AWS CloudFormation 主控台

  2. 使用範本pipeline.yaml檔案建立堆疊,該檔案位於複製儲存庫的 code 資料夾中。

  3. 接受或變更參數的預設值。為下列項目指定值:

    • Stack name (堆疊名稱)

    • ArtifactStoreBucketName – 用來存放 AWS CodePipeline 成品的現有 S3 儲存貯體

    • OutputBucket – 現有的 S3 儲存貯體,用來存放重複映像URIs

    • SourceImageFile – 名為 的現有文字檔案input.txt,其中包含來自公有儲存庫的映像 URIs,該檔案會針對 Amazon ECR 私有儲存庫進行檢查,以偵測重複

  4. 檢閱和調整堆疊選項,然後選擇提交以執行範本。

管道將設定兩個階段 (CodeCommit 和 CodeBuild,如架構圖表所示),以識別私有儲存庫中也存在於公有儲存庫中的映像。管道使用下列資源設定:

  • 用於協調部署管道的 CodePipeline。

  • 儲存 bash 指令碼和輸入檔案的 CodeCommit 儲存庫。bash 指令碼用於比較公有和私有儲存庫中的容器映像 IDs,以尋找重複項目。此檢查會在單一 中指定的所有儲存庫 AWS 帳戶 中執行 AWS 區域。

  • CodeBuild 專案會叫用 bash 指令碼,以識別已存在於 Amazon ECR 儲存庫中的映像。

  • 允許存取的必要 IAM 角色。

  • 儲存包含映像 URIs 的輸出檔案的 S3 儲存貯體。

  • 另一個儲存 CodePipeline 成品的 S3 儲存貯體。 

AWS 管理員、AWS DevOps

填入 CodeCommit 儲存庫。

若要填入 CodeCommit 儲存庫,請執行下列步驟:

  1. 開啟 CodeCommit 主控台,並導覽至 AWS 區域 您建立 CloudFormation 堆疊的 。

  2. 從清單中尋找您使用 CloudFormation 指令碼佈建的儲存庫,選擇複製 URL,然後複製 HTTPS URL 通訊協定以連線至儲存庫。

  3. 開啟命令提示,並使用您在上一個步驟中複製的 HTTPS URL 執行 git 複製命令。

  4. 導覽至根目錄。建立名為 的檔案,input.txt 並將您要在私有 Amazon ECR 儲存庫中搜尋的 Amazon ECR 公有映像登錄 URIs 填入此檔案。

  5. 從 GitHub script.sh儲存庫的input.txt本機複本複製檔案 buildspec.yml、 和 自動解決方案,以識別儲存庫與複製的 CodeCommit 儲存庫之間的重複容器映像。 CodeCommit

  6. 使用以下命令將檔案上傳至 CodeCommit:

    git add . git commit -m “added input files” git push
AWS 管理員、AWS DevOps

清除。

若要避免產生未來的費用,請依照下列步驟刪除資源:

  1. 導覽至存放 CodePipeline 成品的 S3 儲存貯體,然後清空儲存貯體。

  2. 導覽至存放重複映像 URIs的 S3 儲存貯體,然後清空儲存貯體。

  3. 導覽至 CloudFormation 主控台,並刪除您建立來設定管道的堆疊。

AWS 管理員

故障診斷

問題解決方案

當您嘗試從終端機或命令列推送、提取或以其他方式與 CodeCommit 儲存庫互動時,系統會提示您提供使用者名稱和密碼,而且您必須為 IAM 使用者提供 Git 憑證。

此錯誤最常見的原因如下:

  • 您的本機電腦正在執行不支援登入資料管理的作業系統,或尚未安裝登入資料管理公用程式。

  • IAM 使用者的 Git 登入資料尚未儲存至其中一個登入資料管理系統。

根據作業系統和本機環境,您可能需要安裝登入資料管理工具、設定作業系統中包含的登入資料管理工具,或自訂本機環境以使用登入資料儲存體。例如,如果您的電腦正在執行 macOS,您可以使用 Keychain Access 公用程式來存放您的登入資料。如果您的電腦執行 Windows,您可以使用隨著適用於 Windows 的 Git 安裝的 Credential Manager。如需詳細資訊,請參閱 CodeCommit 文件中的使用 Git 登入資料為 HTTPS 使用者設定,以及 Git 文件中的登入資料儲存

當您將映像推送到 Amazon ECR 儲存庫時,遇到 HTTP 403 或「沒有基本身分驗證登入資料」錯誤。

即使您已成功使用 aws ecr get-login-password 命令向 Docker 驗證身分,您仍可能會遇到來自 docker pushdocker pull 命令的這些錯誤訊息。已知原因包括:

  • 您已向不同的區域進行身分驗證。如需詳細資訊,請參閱《Amazon ECR 文件》中的私有登錄身分驗證

  • 您已驗證 ,以推送至您無權使用的儲存庫。如需詳細資訊,請參閱《Amazon ECR 文件》中的私有儲存庫政策

  • 您的字符已過期。使用 GetAuthorizationToken操作取得字符的預設過期期間為 12 小時。

相關資源

其他資訊

Amazon ECR 公有儲存庫中映像的 Docker 檢查輸出

[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]

Amazon ECR 私有儲存庫中映像的 Docker 檢查輸出

[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。