

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

# Amazon ECR 中的私有映像
<a name="images"></a>

Amazon ECR 會將 Docker 映像、Open Container Initiative (OCI) 映像和 OCI 相容成品存放在私有儲存庫中。您可以使用 Docker CLI 或您偏好的用戶端來向您的儲存庫推送和提取映像。

透過 OCI v1.1 的 Amazon ECR 支援，您可以存放和管理 OCI [Referrers API](https://github.com/opencontainers/distribution-spec/blob/main/spec.md#enabling-the-referrers-api) 定義的參考成品。成品包括簽章、軟體物料清單 (SBoMs)、Helm Chart、掃描結果和證明。容器映像的一組成品會與該容器一起傳輸，並儲存為單獨的映像，計算為儲存庫消耗的映像。

[在 Amazon ECR 中簽署映像](image-signing.md) 和 [從 Amazon ECR 私有儲存庫刪除簽章和其他成品](image-artifact-delete.md)頁面提供如何使用簽章相關成品的範例。如需簽署容器映像的詳細資訊，請參閱《 *AWS Signer 開發人員指南*》中的[簽署容器映像](https://docs.aws.amazon.com/signer/latest/developerguide/container-workflow.html)。

**Topics**
+ [將映像推送至 Amazon ECR 私有儲存庫](image-push.md)
+ [從 Amazon ECR 私有儲存庫刪除簽章和其他成品](image-artifact-delete.md)
+ [在 Amazon ECR 中檢視影像詳細資訊](image-info.md)
+ [從 Amazon ECR 私有儲存庫將映像提取到您的本機環境](docker-pull-ecr-image.md)
+ [提取 Amazon Linux 容器映像](amazon_linux_container_image.md)
+ [在 Amazon ECR 中刪除映像](delete_image.md)
+ [在 Amazon ECR 中封存映像](archive_restore_image.md)
+ [在 Amazon ECR 中重新標記映像](image-retag.md)
+ [防止在 Amazon ECR 中覆寫映像標籤](image-tag-mutability.md)
+ [Amazon ECR 中的容器映像資訊清單格式支援](image-manifest-formats.md)
+ [將 Amazon ECR 映像與 Amazon ECS 搭配使用](ECR_on_ECS.md)
+ [將 Amazon ECR 映像與 Amazon EKS 搭配使用](ECR_on_EKS.md)

# 將映像推送至 Amazon ECR 私有儲存庫
<a name="image-push"></a>

您可以將 Docker 映像、資訊清單清單和開放容器計畫 (OCI) 映像和相容的成品推送至您的私有儲存庫。

Amazon ECR 提供將映像複寫到其他儲存庫的方法。透過在私有登錄檔設定中指定複寫組態，您可以在自己的登錄檔中跨區域複寫，並在不同的帳戶中複寫。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔設定](registry-settings.md)。

**注意**  
如果您推送目前封存的映像，該映像會自動從封存中還原和移除。如需封存和還原映像的詳細資訊，請參閱[在 Amazon ECR 中封存映像](archive_restore_image.md)。

啟用登錄 Blob 掛載並包含掛載參數時，Amazon ECR 會在推送操作期間自動檢查登錄檔中的現有層。如果圖層已存在於相同登錄檔中的另一個儲存庫中，Amazon ECR 會掛載現有的圖層，而不是上傳重複的圖層。如需詳細資訊，請參閱[Amazon ECR 中的 Blob 掛載](blob-mounting.md)。

**Topics**
+ [將映像推送至 Amazon ECR 私有儲存庫的 IAM 許可](image-push-iam.md)
+ [將 Docker 映像推送至 Amazon ECR 私有儲存庫](docker-push-ecr-image.md)
+ [將多架構映像推送至 Amazon ECR 私有儲存庫](docker-push-multi-architecture-image.md)
+ [將 Helm Chart 推送至 Amazon ECR 私有儲存庫](push-oci-artifact.md)

# 將映像推送至 Amazon ECR 私有儲存庫的 IAM 許可
<a name="image-push-iam"></a>

使用者需要 IAM 許可，才能將映像推送至 Amazon ECR 私有儲存庫。遵循授予最低權限的最佳實務，您可以授予特定儲存庫的存取權。您也可以授予所有儲存庫的存取權。

使用者必須透過請求授權字符，向他們想要推送映像的每個 Amazon ECR 登錄檔進行身分驗證。Amazon ECR 提供多種 AWS 受管政策，以控制不同層級的使用者存取。如需詳細資訊，請參閱[AWS Amazon Elastic Container Registry 的 受管政策](security-iam-awsmanpol.md)。

您也可以建立自己的 IAM 政策。下列 IAM 政策會授予將映像推送至特定儲存庫所需的許可。若要限制特定儲存庫的許可，請使用儲存庫的完整 Amazon Resource Name (ARN)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/repository-name"
        },
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}
```

------

下列 IAM 政策會授予將映像推送至所有儲存庫所需的許可。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                    "ecr:CompleteLayerUpload",
                    "ecr:GetAuthorizationToken",
                    "ecr:UploadLayerPart",
                    "ecr:InitiateLayerUpload",
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:PutImage",
                    "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-west-2:111122223333:repository/*"
        } 
    ]
}
```

# 將 Docker 映像推送至 Amazon ECR 私有儲存庫
<a name="docker-push-ecr-image"></a>

您可以使用 **docker push** 命令將容器映像推送到 Amazon ECR 儲存庫。

Amazon ECR 也支援建立和推送用於多架構映像的 Docker 資訊清單清單。如需相關資訊，請參閱[將多架構映像推送至 Amazon ECR 私有儲存庫](docker-push-multi-architecture-image.md)。

**將 Docker 映像推送至 Amazon ECR 儲存庫**

在推送映像之前，Amazon ECR 儲存庫必須存在，否則您必須定義儲存庫建立範本。如需詳細資訊，請參閱[建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)及[用於控制提取快取、推送時建立或複寫動作期間建立的儲存庫的範本](repository-creation-templates.md)。

1. 向打算推送映像的 Amazon ECR 登錄檔驗證您的 Docker 用戶端。所用的每個登錄檔皆必須取得身分驗證字符，字符有效期間為 12 個小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

   若要向 Amazon ECR 登錄檔驗證 Docker，請執行 **aws ecr get-login-password** 命令。將身分驗證字符傳遞給 **docker login** 命令時，使用 `AWS` 的值作為使用者名稱並指定您要驗證的 Amazon ECR 登錄檔 URI。如果是向多個登錄進行驗證，您必須針對每個登錄重複此命令。
**重要**  
若您收到錯誤，請安裝或升級至最新版本的 AWS CLI。如需詳細資訊，請參閱「AWS Command Line Interface 使用者指南」**中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

   ```
   aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
   ```

1. 如果您的映像儲存庫不存在於您要推送到的登錄檔中，且您已定義儲存庫建立範本，您可以使用儲存庫建立範本的字首和所需的儲存庫名稱來推送映像。ECR 將使用儲存庫建立範本的預先定義設定，自動為您建立儲存庫。

   如果您沒有定義相符的儲存庫建立範本，則需要建立儲存庫。如需詳細資訊，請參閱 [用於控制提取快取、推送時建立或複寫動作期間建立的儲存庫的範本](repository-creation-templates.md) 或 [建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md) 。

1. 找出要推送的本機映像。執行 **docker images** 命令，列出系統上的容器映像。

   ```
   docker images
   ```

   可用 *repository:tag* 值或映像 ID 從產生的命令輸出中找出映像。

1. <a name="image-tag-step"></a>在映像上標記要使用的 Amazon ECR 登錄檔、儲存庫和可選用的映像標籤名稱組合。登錄檔格式為  `aws_account_id.dkr.ecr.region.amazonaws.com`。儲存庫名稱應與您為映像建立的儲存庫名稱相符。如果省略映像標籤，系統將假設標籤為 `latest`。

   下列範例會將 ID 為 * e9ae3c220b23* 的本機映像標記為 `aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag`。

   ```
   docker tag e9ae3c220b23 aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag
   ```

1. <a name="image-push-step"></a>使用 **docker push** 命令推送映像：

   ```
   docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag
   ```

1. (選用) 重覆執行 [Step 4](#image-tag-step) 和 [Step 5](#image-push-step)，套用任何其他標籤至映像，並將標籤推送至 Amazon ECR。

# 將多架構映像推送至 Amazon ECR 私有儲存庫
<a name="docker-push-multi-architecture-image"></a>

您可以透過建立和推送 Docker 資訊清單清單，將多架構映像推送至 Amazon ECR 儲存庫。*資訊清單列表*是藉由指定一或多個映像名稱而建立的映像清單。在大多數情況下，資訊清單清單是從提供相同函數，但適用於不同作業系統或架構的映像建立的。資訊清單不是必要選項。如需詳細資訊，請參閱 [Docker 資訊清單](https://docs.docker.com/engine/reference/commandline/manifest/)。

資訊清單列表可以像其他 Amazon ECR 映像一樣，在 Amazon ECS 任務定義或 Amazon EKS Pod 規格中提取或參考。

 **先決條件** 
+ 在您的 Docker CLI 中，開啟實驗性功能。如需實驗功能的資訊，請參閱 Docker 文件中的[實驗功能](https://docs.docker.com/engine/reference/commandline/cli/#experimental-features)。
+ 在您推送映像之前，Amazon ECR 儲存庫必須存在。如需詳細資訊，請參閱[建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)。
+ 您必須先將映像推送至儲存庫，才能建立 Docker 資訊清單。如需如何推送映像的資訊，請參閱 [將 Docker 映像推送至 Amazon ECR 私有儲存庫](docker-push-ecr-image.md)。

**將多架構 Docker 映像推送到 Amazon ECR 儲存庫**

1. 向打算推送映像的 Amazon ECR 登錄檔驗證您的 Docker 用戶端。所用的每個登錄檔皆必須取得身分驗證字符，字符有效期間為 12 個小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

   若要向 Amazon ECR 登錄檔驗證 Docker，請執行 **aws ecr get-login-password** 命令。將身分驗證字符傳遞給 **docker login** 命令時，使用 `AWS` 的值作為使用者名稱並指定您要驗證的 Amazon ECR 登錄檔 URI。如果是向多個登錄進行驗證，您必須針對每個登錄重複此命令。
**重要**  
若您收到錯誤，請安裝或升級至最新版本的 AWS CLI。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

   ```
   aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
   ```

1. 列出儲存庫中的映像，請確認映像標籤。

   ```
   aws ecr describe-images --repository-name my-repository
   ```

1. 建立 Docker 資訊清單列表。`manifest create` 命令會驗證參考的映像是否已在您的儲存庫中，並在本機建立資訊清單。

   ```
   docker manifest create aws_account_id.dkr.ecr.region.amazonaws.com/my-repository aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:image_one_tag aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:image_two
   ```

1. (選用) 檢查 Docker 資訊清單列表。這可讓您確認資訊清單列表中參照的每個映像資訊清單的大小和摘要。

   ```
   docker manifest inspect aws_account_id.dkr.ecr.region.amazonaws.com/my-repository
   ```

1. 將 Docker 資訊清單列表推送至您的 Amazon ECR 儲存庫。

   ```
   docker manifest push aws_account_id.dkr.ecr.region.amazonaws.com/my-repository
   ```

# 將 Helm Chart 推送至 Amazon ECR 私有儲存庫
<a name="push-oci-artifact"></a>

您可以將開放容器計畫 (OCI) 成品推送至 Amazon ECR 儲存庫。若要查看此功能的範例，請使用下列步驟將 Helm Chart 推送至 Amazon ECR。

如需搭配 Amazon EKS 使用 Amazon ECR 託管 Helm Chart 的詳細資訊，請參閱 [在 Amazon EKS 叢集上安裝 Helm Chart](using-helm-charts-eks.md)。

**將 Helm Chart 推送到 Amazon ECR 儲存庫**

1. 安裝 Helm 用戶端的最新版本。這些步驟是使用 Helm 版本 `3.18.6` 進行編寫。為了與 Amazon EKS 支援的 Kubernetes 版本相容，請使用 Helm 3.9 版或更新版本。如需詳細資訊，請參閱[安裝 Helm](https://helm.sh/docs/intro/install/)。

1. 使用下列步驟來建立測試 Helm Chart。如需詳細資訊，請參閱 [Helm Docs - 開始使用](https://helm.sh/docs/chart_template_guide/getting_started/)。

   1. 建立一個名為 `helm-test-chart` 的 Helm Chart 並清除 `templates` 目錄的內容。

      ```
      helm create helm-test-chart
      rm -rf ./helm-test-chart/templates/*
      ```

   1. `ConfigMap` 在 `templates` 資料夾中建立 。

      ```
      cd helm-test-chart/templates
      cat <<EOF > configmap.yaml
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: helm-test-chart-configmap
      data:
        myvalue: "Hello World"
      EOF
      ```

1. 封裝圖表。輸出將包含您在推送 Helm Chart 時使用的封裝圖表的檔案名稱。

   ```
   cd ../..
   helm package helm-test-chart
   ```

   Output

   ```
   Successfully packaged chart and saved it to: /Users/username/helm-test-chart-0.1.0.tgz
   ```

1. 建立儲存庫以存放 Helm Chart。儲存庫的名稱應與您在步驟 2 中建立 Helm Chart 時使用的名稱相符。如需詳細資訊，請參閱[建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)。

   ```
   aws ecr create-repository \
        --repository-name helm-test-chart \
        --region us-west-2
   ```

1. 將您的 Helm 用戶端驗證到您打算將 Helm Chart 推送到的 Amazon ECR 登錄檔。所用的每個登錄檔皆必須取得身分驗證字符，字符有效期間為 12 個小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

   ```
   aws ecr get-login-password \
        --region us-west-2 | helm registry login \
        --username AWS \
        --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

1. 使用 **helm push** 命令推送 Helm Chart。輸出應該包括 Amazon ECR 儲存庫 URI 和 SHA 摘要。

   ```
   helm push helm-test-chart-0.1.0.tgz oci://aws_account_id.dkr.ecr.region.amazonaws.com/
   ```

1. 描述您的 Helm Chart。

   ```
   aws ecr describe-images \
        --repository-name helm-test-chart \
        --region us-west-2
   ```

   在輸出中，確認 `artifactMediaType` 參數指出適當的成品類型。

   ```
   {
       "imageDetails": [
           {
               "registryId": "aws_account_id",
               "repositoryName": "helm-test-chart",
               "imageDigest": "sha256:dd8aebdda7df991a0ffe0b3d6c0cf315fd582cd26f9755a347a52adEXAMPLE",
               "imageTags": [
                   "0.1.0"
               ],
               "imageSizeInBytes": 1620,
               "imagePushedAt": "2021-09-23T11:39:30-05:00",
               "imageManifestMediaType": "application/vnd.oci.image.manifest.v1+json",
               "artifactMediaType": "application/vnd.cncf.helm.config.v1+json"
           }
       ]
   }
   ```

1. （選用） 如需其他步驟，請安裝 Helm `ConfigMap`並開始使用 Amazon EKS。如需詳細資訊，請參閱[在 Amazon EKS 叢集上安裝 Helm Chart](using-helm-charts-eks.md)。

# 從 Amazon ECR 私有儲存庫刪除簽章和其他成品
<a name="image-artifact-delete"></a>

您可以使用 ORAS 用戶端，從 Amazon ECR 私有儲存庫列出和刪除簽章和其他參考類型成品。刪除簽章和其他參考成品類似於刪除映像的方式 （請參閱 [在 Amazon ECR 中刪除映像](delete_image.md))。以下是如何列出成品和刪除簽章的方法：

**使用 ORAS CLI 管理影像成品**

1. 安裝和設定 ORAS 用戶端。

   如需有關安裝和設定 ORAS 用戶端的資訊，請參閱 ORAS 文件中的[安裝](https://oras.land/docs/installation)。

1. 若要列出 Amazon ECR 映像的可用成品，請使用 `oras discover`，後面接著映像名稱：

   ```
   oras discover 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci:helloworld
   ```

   輸出看起來會與此類似：

   ```
   111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:88c0c54329bfdc1d94d6f58cd3fcb1226d46f58670f44a8c689cb3c9b37b6925
   └── application/vnd.cncf.notary.signature
       ├── sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42
       └── sha256:6527bcec87adf1d55460666183b9d0968b3cd4e4bc34602d485206a219851171
   ```

1. 若要使用 ORAS CLI 刪除簽章，根據先前的範例，請執行下列命令：

   ```
   oras manifest delete 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42
   ```

   輸出看起來會與此類似：

   ```
   Are you sure you want to delete the manifest "111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42" and all tags associated with it? [y/N] y
   ```

1. 按 `y` 鍵。應刪除成品。

**對成品刪除進行疑難排解**

如果簽章刪除，例如剛才顯示的簽章刪除應該失敗，則會顯示類似以下的輸出。

```
Error response from registry: failed to delete 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42:
unsupported: Requested image referenced by manifest list: [sha256:005e2c97a6373e483799fa4ff29ac64a42dd10f08efcc166d6775f9b74943b5b]
```

刪除在 OCI 1.1 啟動之前推送的映像時，可能會發生此失敗。如錯誤中所述，您必須先刪除參考映像的資訊清單，才能刪除映像，如下所示：

1. 若要刪除與要刪除的簽章相關聯的資訊清單，請輸入：

   ```
    oras manifest delete 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:005e2c97a6373e483799fa4ff29ac64a42dd10f08efcc166d6775f9b74943b5b
   ```

   輸出看起來會與此類似：

   ```
   Are you sure you want to delete the manifest "sha256:005e2c97a6373e483799fa4ff29ac64a42dd10f08efcc166d6775f9b74943b5b" and all tags associated with it? [y/N] y
   ```

1. 按 `y` 鍵。應刪除資訊清單。

1. 當資訊清單消失時，您可以刪除簽章：

   ```
    oras manifest delete 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42
   ```

   輸出看起來應該像這樣。按 `y` 鍵。

   ```
   Are you sure you want to delete the manifest "sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42" and all tags associated with it? [y/N] y
   Deleted [registry] 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:387c10c1598ee18aae81dcfc86d0d06d116e46461d1c3cda8927e69c48108c42
   ```

1. 若要查看簽章已刪除，請輸入：

   ```
   oras discover 111222333444.dkr.ecr.us-east-1.amazonaws.com/oci:helloworld
   ```

   輸出看起來會與此類似：

   ```
   111222333444.dkr.ecr.us-east-1.amazonaws.com/oci@sha256:88c0c54329bfdc1d94d6f58cd3fcb1226d46f58670f44a8c689cb3c9b37b6925
   └── application/vnd.cncf.notary.signature
       └── sha256:6527bcec87adf1d55460666183b9d0968b3cd4e4bc34602d485206a219851171
   ```

# 在 Amazon ECR 中檢視影像詳細資訊
<a name="image-info"></a>

將映像推送至儲存庫後，您可以檢視其相關資訊。包含的詳細資訊如下：
+ 映像 URI
+ 映像標籤
+ 成品媒體類型
+ 映像資訊清單類型
+ 掃描狀態
+ 映像大小 (以 MB 為單位)
+ 將映像推送至儲存庫的時間
+ 複寫狀態

**檢視映像詳細資訊 (AWS 管理主控台)**

1. 在 [https://console.aws.amazon.com/ecr/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列上，選擇包含映像的儲存庫的區域。

1. 在導覽窗格中，選擇 **Repositories** (儲存庫)。

1. 在 **Repositories** (儲存庫) 頁面上，選擇儲存庫以檢視。

1. 在 **Repositories : *repository\$1name*** (儲存庫：repository\$1name) 頁面上，選擇要檢視的詳細資訊的映像。

# 從 Amazon ECR 私有儲存庫將映像提取到您的本機環境
<a name="docker-pull-ecr-image"></a>

如果您要執行在 Amazon ECR 中可用的 Docker 映像，您可以使用 **docker pull** 命令來將其提取至本機環境。您可以從預設登錄檔或與另一個 AWS 帳戶相關聯的登錄檔執行此操作。

若要在 Amazon ECS 任務定義中使用 Amazon ECR 映像，請參閱 [將 Amazon ECR 映像與 Amazon ECS 搭配使用](ECR_on_ECS.md)。

**重要**  
您無法提取封存的映像。封存的映像必須先還原，才能提取。如需封存和還原映像的詳細資訊，請參閱[在 Amazon ECR 中封存映像](archive_restore_image.md)。

**重要**  
Amazon ECR 要求使用者擁有透過 IAM 政策呼叫 `ecr:GetAuthorizationToken` API 的許可，然後才能對登錄檔進行身分驗證，並從任何 Amazon ECR 儲存庫推送或提取任何映像。Amazon ECR 提供多種 AWS 受管政策，以控制不同層級的使用者存取。如需 Amazon ECR AWS 受管政策的相關資訊，請參閱 [AWS Amazon Elastic Container Registry 的 受管政策](security-iam-awsmanpol.md)。

**從 Amazon ECR 儲存庫提取 Docker 映像**

1. 向打算提取映像的 Amazon ECR 登錄檔驗證您的 Docker 用戶端。所用的每個登錄檔皆必須取得身分驗證字符，字符有效期間為 12 個小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

1. (選用) 找出要提取的映像。
   + 可用 **aws ecr describe-repositories** 命令列出登錄檔內的儲存庫：

     ```
     aws ecr describe-repositories
     ```

     上述登錄檔範例有一個名為 `amazonlinux` 的儲存庫。
   + 可用 **aws ecr describe-images** 命令描述儲存庫內的映像：

     ```
     aws ecr describe-images --repository-name amazonlinux
     ```

     上述的儲存庫範例有標記為 `latest` 和 `2016.09`，映像摘要為 ` sha256:f1d4ae3f7261a72e98c6ebefe9985cf10a0ea5bd762585a43e0700ed99863807` 的映像。

1. 使用 **docker pull** 命令提取映像。映像名稱格式應為 `registry/repository [:tag]` 才可依標籤提取，或為 `registry /repository[@digest]` 才可依摘要提取。

   ```
   docker pull aws_account_id.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest
   ```
**重要**  
如果出現 `repository-url not found: does not exist or no pull access` 錯誤，則需向 Amazon ECR 驗證您的 Docker 用戶端。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

# 提取 Amazon Linux 容器映像
<a name="amazon_linux_container_image"></a>

Amazon Linux 容器映像是透過在 Amazon Linux AMI 中包含的相同軟體元件所建置。Amazon Linux 容器映像可在任何環境中使用，做為 Docker 工作負載的基礎映像。如果您將 Amazon Linux AMI 用於 Amazon EC2 中的應用程式，您可以使用 Amazon Linux 容器映像來容器化應用程式。

您可以在本機開發環境中使用 Amazon Linux 容器映像，然後使用 Amazon ECS 將應用程式推送至 AWS 。如需詳細資訊，請參閱[將 Amazon ECR 映像與 Amazon ECS 搭配使用](ECR_on_ECS.md)。

Amazon Linux 容器映像可在 Amazon ECR Public 及 [Docker Hub](https://hub.docker.com/_/amazonlinux/) 使用。如需 Amazon Linux 容器映像的支援，請前往[AWS 開發人員論壇](https://forums.aws.amazon.com/forum.jspa?forumID=228)。

**從 Amazon ECR Public 中提取 Amazon Linux 容器映像**

1. 向 Amazon Linux Public 登錄檔驗證您的 Docker 用戶端。驗證字符有效時間為 12 小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。
**注意**  
從版本 `1.18.1.187` 開始，可以在 AWS CLI 中使用 **ecr-public** 命令，但我們建議使用最新版的 AWS CLI。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

   ```
   aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
   ```

   其輸出如下：

   ```
   Login succeeded
   ```

1. 使用 **docker pull** 命令提取 Amazon Linux 容器映像。若要在 Amazon ECR Public Gallery 上查看 Amazon Linux 容器映像，請參閱 [Amazon ECR Public Gallery - amazonlinux](https://gallery.ecr.aws/amazonlinux/amazonlinux)。

   ```
   docker pull public.ecr.aws/amazonlinux/amazonlinux:latest
   ```

1. (選用) 在本機執行容器。

   ```
   docker run -it public.ecr.aws/amazonlinux/amazonlinux /bin/bash
   ```

**從 Docker Hub 提取 Amazon Linux 容器映像**

1. 使用 **docker pull** 命令提取 Amazon Linux 容器映像。

   ```
   docker pull amazonlinux
   ```

1. (選用) 在本機執行容器。

   ```
   docker run -it amazonlinux:latest /bin/bash
   ```

# 在 Amazon ECR 中刪除映像
<a name="delete_image"></a>

如果您已完成使用映像，即可將其從儲存庫中刪除。如果您完成使用儲存庫，您可以刪除整個儲存庫及其中的所有映像。如需詳細資訊，請參閱[在 Amazon ECR 中刪除私有儲存庫](repository-delete.md)。

作為手動刪除映像的替代方法，您可以建立儲存庫生命週期政策，以更好地控制儲存庫中映像的生命週期管理。生命週期政策會為您自動執行此程序。如需詳細資訊，請參閱[在 Amazon ECR 中使用生命週期政策來自動化映像的清除](LifecyclePolicies.md)。

**注意**  
 如果您的儲存庫混合了映像，其中一些會在 Amazon ECR 支援的 OCI 1.1 版之前推送，則某些簽章會有指向它們的映像索引或資訊清單清單。因此，當您刪除預先 OCI v1.1 映像時，您可能需要手動刪除參考映像的資訊清單清單，才能刪除成品。

**刪除映像 (AWS 管理主控台)**

1. 在 [https://console.aws.amazon.com/ecr/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列上，選擇包含要刪除之映像的區域。

1. 在導覽窗格中，選擇 **Repositories** (儲存庫)。

1. 在 **Repositories** (儲存庫) 頁面上，選擇包含要刪除之映像的儲存庫。

1. 在**儲存庫：*positorage\$1name*** 頁面上，選取要刪除之影像左側的方塊，然後選擇**刪除**。

1. 在 **Delete image(s)** (刪除映像) 對話方塊中，確認應刪除的映像已被選擇，再選擇 **Delete** (刪除)。

**刪除映像 (AWS CLI)**

1. 在儲存庫中列出映像。標籤映像會同時具有映像摘要以及相關標籤的清單。未標籤的映像只會有映像摘要。

   ```
   aws ecr list-images \
        --repository-name my-repo
   ```

1. (選用) 透過指定與要刪除的映像關聯的標籤來刪除映像的任何不需要的標籤。當從映像中刪除最後一個標籤時，映像也會遭到刪除。

   ```
   aws ecr batch-delete-image \
        --repository-name my-repo \
        --image-ids imageTag=tag1 imageTag=tag2
   ```

1. 指定映像摘要以刪除標籤或未標籤的映像。透過參照摘要的方式刪除映像時，該映像及其所有標籤將遭刪除。

   ```
   aws ecr batch-delete-image \
        --repository-name my-repo \
        --image-ids imageDigest=sha256:4f70ef7a4d29e8c0c302b13e25962d8f7a0bd304EXAMPLE
   ```

   若要刪除多個映像，您可以在請求中指定多個映像標籤或映像摘要。

   ```
   aws ecr batch-delete-image \
        --repository-name my-repo \
        --image-ids imageDigest=sha256:4f70ef7a4d29e8c0c302b13e25962d8f7a0bd304EXAMPLE imageDigest=sha256:f5t0e245ssffc302b13e25962d8f7a0bd304EXAMPLE
   ```

# 在 Amazon ECR 中封存映像
<a name="archive_restore_image"></a>

## 什麼是 ECR 封存儲存類別？
<a name="archive-what-is"></a>

Amazon ECR 封存儲存體方案是新的儲存體方案，可為容器映像提供低成本、長期的儲存體。Amazon ECR 提供兩種儲存類別：
+ **ECR 標準儲存類別** – 定期存取之作用中映像的預設儲存類別。
+ **ECR 封存儲存類別** – 很少存取但需要保留以進行合規或長期參考之映像的低成本儲存類別。與標準儲存體方案相比，封存儲存體方案可為大量映像節省長期映像保留的成本。如需詳細的定價資訊，請參閱 [Amazon ECR 定價](https://aws.amazon.com/ecr/pricing/)。

若要封存映像，您有兩個選項。首先，您可以設定生命週期規則，根據下列項目自動封存映像：
+ 自推送映像以來的時間
+ 自上次提取映像以來的時間
+ 儲存庫中的映像數量

您也可以將設定設定為在封存影像一段指定期間之後將其永久刪除。請參閱 [在 Amazon ECR 中使用生命週期政策來自動化映像的清除](LifecyclePolicies.md)，了解詳細資訊。

您也可以使用 Amazon ECR 主控台或 封存映像 AWS CLI。請參閱 [封存映像](archive-image.md)，了解詳細資訊。

當您需要再次使用封存的映像時，您可以將其還原至 ECR 標準儲存類別。您可以預期 ECR 會在 20 分鐘內還原映像。還原的映像的行為類似於新推送的映像，可在還原完成時立即使用。還原的映像受限於掃描、複寫和儲存庫生命週期政策。請參閱 [還原映像](restore-image.md)，了解詳細資訊。

# 封存映像
<a name="archive-image"></a>

您可以使用 Amazon ECR 主控台或 手動封存映像 AWS CLI，或使用生命週期政策自動封存映像。封存映像時：
+ 影像會移至封存儲存體方案。
+ 封存的映像無法提取。提取封存映像的請求會失敗，並顯示 404 錯誤。
+ 雖然無法提取映像，但仍可以使用 ** describe-images**命令來描述，或使用 **list-images**命令來列出。影像狀態會顯示為 `ARCHIVED`。
+ 封存映像的最短儲存期間為 90 天。您無法設定生命週期政策來刪除已存檔不到 90 天的映像。如果您必須刪除已封存不到 90 天的映像，則需要使用 **batch-delete-image** API，但需支付 90 天最低儲存持續時間的費用。
+ 映像會出現在儲存庫檢視的**封存映像**索引標籤中 （只有在儲存庫中至少封存一個映像時，才會顯示此索引標籤）。
+ 您可以透過手動選取要還原的映像，或將映像重新推送至儲存庫，將映像還原為作用中映像。
+ 如果儲存庫具有生命週期政策來刪除具有封存時間等條件的映像，則會刪除映像。

------
#### [ AWS 管理主控台 ]

**封存映像**

1. 在 [https://console.aws.amazon.com/ecr/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列中，選擇包含儲存庫的 區域，其中包含您要封存的映像。

1. 在導覽窗格中，選擇 **Repositories** (儲存庫)。

1. 在**儲存庫**頁面上，選擇包含您要封存之映像的儲存庫。

1. 選取您要封存的映像。您將看到影像詳細資訊。

1. 若要封存映像，請選取**封存**按鈕，然後選取出現提示時**確認**。

1. 如果這是儲存庫中的第一個封存映像，則新**封存映像**索引標籤會顯示新封存映像。如果有其他封存的映像，此映像會新增至該索引標籤。

------
#### [ AWS CLI ]

**封存映像**
+ 使用 **update-image-storage-class**命令，透過將映像的儲存類別更新為 來封存映像`ARCHIVE`：

  ```
  aws ecr update-image-storage-class \
      --repository-name my-repository \
      --image-id imageDigest=sha256:4f70ef7a4d29e8c0c302b13e25962d8f7a0bd304EXAMPLE \
      --target-storage-class ARCHIVE
  ```

------

**使用生命週期政策封存映像**
+ 您可以使用生命週期政策來設定儲存庫的封存規則，以自動封存映像。生命週期政策可讓您根據下列條件自動封存映像：
  + 自推送映像以來的時間
  + 自上次提取映像以來的時間
  + 保持作用中的影像數量上限

  您也可以設定生命週期政策，在映像封存一段指定期間之後將其永久刪除。如需使用封存動作之生命週期政策的詳細資訊和範例，請參閱 [在 Amazon ECR 中使用生命週期政策來自動化映像的清除](LifecyclePolicies.md)。
**注意**  
封存映像的最短儲存期間為 90 天。您無法設定生命週期政策來刪除已存檔不到 90 天的映像。如果您必須刪除已封存不到 90 天的映像，則需要使用 **batch-delete-image** API，但需支付 90 天最低儲存持續時間的費用。

當您使用 **describe-images**命令描述映像時，封存的映像具有 `image-status`的 `ARCHIVED`。您可以依 篩選影像`image-status`，僅檢視封存的影像或作用中的影像。

# 還原映像
<a name="restore-image"></a>

當您還原封存的映像時，它會從 ECR Archive 儲存類別移回 ECR Standard 儲存類別。還原的映像會依標準儲存費率收費。還原程序會執行建立新映像時發生的類似動作：
+ 當還原完成時，映像可供提取。還原通常需要 20 分鐘的時間，但可能會更快完成。
+ 如果為儲存庫啟用推送時掃描，則會掃描還原的映像。請注意，在封存映像之前，之前的掃描結果將無法使用。
+ 如果已為儲存庫設定複寫，則在還原時啟用複寫時，將會複寫還原的影像。
+ 還原的映像會出現在作用中映像清單中。

還原映像通常需要 20 分鐘的時間，但可能會更快完成。在還原程序期間，映像會維持在封存狀態，而且在還原完成之前無法提取。

------
#### [ AWS 管理主控台 ]

**還原封存的映像**

1. 在 [https://console.aws.amazon.com/ecr/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列中，選擇包含儲存庫的 區域，其中包含您要還原的封存映像。

1. 在導覽窗格中，選擇 **Repositories** (儲存庫)。

1. 在**儲存庫**頁面上，選擇包含封存映像的儲存庫。

1. 選擇**封存映像**索引標籤。

1. 選取您要還原的封存映像。

1. 選擇**還原**並確認還原動作。

1. 等待還原完成。還原完成後，映像會出現在作用中映像清單中。

------
#### [ AWS CLI ]

**還原封存的映像**
+ 使用 **update-image-storage-class**命令，透過將封存映像的儲存類別更新為 來還原封存映像`STANDARD`：

  ```
  aws ecr update-image-storage-class \
      --repository-name my-repository \
      --image-id imageDigest=sha256:4f70ef7a4d29e8c0c302b13e25962d8f7a0bd304EXAMPLE \
      --target-storage-class STANDARD
  ```

------

當您使用 **describe-images**命令描述映像時，正在還原的映像具有 `image-status`的 `ACTIVATING`。您可以使用 `image-status` 值篩選映像`ACTIVATING`，以檢視目前正在還原的映像。

還原封存映像的替代方法是將映像重新推送至儲存庫。當您推送目前封存的映像時，該映像會立即還原並從封存中移除。

# 在 Amazon ECR 中重新標記映像
<a name="image-retag"></a>

透過 Docker 映像資訊清單 V2 結構描述 2 映像，您可以使用 `--image-tag` 命令的 **put-image** 選項以重新標記現有映像。您可以使用 Docker 來重新標記，而不需提取和推送映像。針對較大的映像，此程序節省了重新標記映像所需的大量網路頻寬與時間。

## 重新標記映像 (AWS CLI)
<a name="retag-aws-cli"></a>

**使用 重新標記映像 AWS CLI**

1. 使用 **batch-get-image** 命令以取得映像的映像資訊清單，來重新標記並將其寫入檔案。在此範例中，儲存庫 *amazonlinux* 中擁有 *latest* 標籤的映像資訊清單，被寫入名為 *MANIFEST* 的環境變數。

   ```
   MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --output text --query 'images[].imageManifest')
   ```

1. 使用 **put-image** 命令的 `--image-tag` 選項，以新標籤將映像工作資訊清單檔案放至 Amazon ECR。在此範例中，該映像被標記為 *2017.03*。
**注意**  
如果您的 版本無法使用 `--image-tag`選項 AWS CLI，請升級到最新版本。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

   ```
   aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest "$MANIFEST"
   ```

1. 確認您的新映像標籤已連接至您的映像。在下方的輸出中，該映像有標籤 `latest` 與 ` 2017.03`。

   ```
   aws ecr describe-images --repository-name amazonlinux
   ```

   其輸出如下：

   ```
   {
       "imageDetails": [
           {
               "imageSizeInBytes": 98755613,
               "imageDigest": "sha256:8d00af8f076eb15a33019c2a3e7f1f655375681c4e5be157a26EXAMPLE",
               "imageTags": [
                   "latest",
                   "2017.03"
               ],
               "registryId": "aws_account_id",
               "repositoryName": "amazonlinux",
               "imagePushedAt": 1499287667.0
           }
       ]
   }
   ```

## 重新標記映像 (AWS Tools for Windows PowerShell)
<a name="retag-powershell"></a>

**使用 重新標記映像 AWS Tools for Windows PowerShell**

1. 使用 **Get-ECRImageBatch****cmdlet**取得映像的描述，以重新標記並寫入環境變數。在此範例中，儲存庫 *amazonlinux* 中具有*最新* 標籤的映像會寫入環境變數 *\$1Image*。
**注意**  
如果您的系統沒有**Get-ECRImageBatch**** cmdlet**可用的 ，請參閱*AWS Tools for PowerShell 《 使用者指南*》中的[設定 AWS Tools for Windows PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

   ```
   $Image = Get-ECRImageBatch -ImageId @{ imageTag="latest" } -RepositoryName amazonlinux
   ```

1. 將映像的資訊清單寫入 *\$1Manifest* 環境變數。

   ```
   $Manifest = $Image.Images[0].ImageManifest
   ```

1. 使用 `-ImageTag`的選項，將映像資訊清單**Write-ECRImage**** cmdlet**放入具有新標籤的 Amazon ECR。在此範例中，該映像被標記為 *2017.09*。

   ```
   Write-ECRImage -RepositoryName amazonlinux -ImageManifest $Manifest -ImageTag 2017.09
   ```

1. 確認您的新映像標籤已連接至您的映像。在下方的輸出中，該映像有標籤 `latest` 與 ` 2017.09`。

   ```
   Get-ECRImage -RepositoryName amazonlinux
   ```

   其輸出如下：

   ```
   ImageDigest                                                             ImageTag
   -----------                                                             --------
   sha256:359b948ea8866817e94765822787cd482279eed0c17bc674a7707f4256d5d497 latest
   sha256:359b948ea8866817e94765822787cd482279eed0c17bc674a7707f4256d5d497 2017.09
   ```

# 防止在 Amazon ECR 中覆寫映像標籤
<a name="image-tag-mutability"></a>

您可以在儲存庫中開啟標籤不可變性，以防止映像標籤遭到覆寫。開啟標籤不可變性後，如果您推送的映像具有已在儲存庫中的標籤，則會傳回` ImageTagAlreadyExistsException`錯誤。標籤不可變性會影響所有標籤。您無法讓某些標籤不可變，而其他標籤則不可變。

您可以使用 AWS 管理主控台 和 AWS CLI 工具來設定新儲存庫或現有儲存庫的影像標籤可變性。若要使用主控台步驟建立儲存庫，請參閱 [建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)。

## 設定影像標籤可變性 (AWS 管理主控台)
<a name="repository-edit"></a>

**設定影像標籤可變性**

1. 在 [https://console.aws.amazon.com/ecr/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列上，選擇包含要編輯之儲存庫的區域。

1. 在導覽窗格中，選擇**私有登錄**檔下的**儲存庫**。

   如果您沒有看到**儲存庫**，請選擇**私有登錄**檔以展開選單，然後選擇**儲存庫**。

1. 在**私有儲存庫**頁面上，選擇您要設定影像標籤可變性設定的儲存庫名稱前面的選項按鈕。

1. 選擇**動作**，然後在**編輯**下選擇**儲存庫**。

1. 針對**影像標籤不可變性**，選擇下列其中一個儲存庫的標籤可變性設定。
   + **可互**斥 – 如果您想要覆寫影像標籤，請選擇此選項。建議用於使用提取快取動作的儲存庫，以確保 Amazon ECR 可以更新快取映像。此外，若要停用幾個可變標籤的標籤更新，請輸入標籤名稱或使用萬用字元 (\$1) 來比對 **Mutable 標籤排除文字方塊中的多個類似標籤**。
   + **不可變**：如果您想要防止映像標籤遭到覆寫，而且在推送具有現有標籤的映像時，它適用於儲存庫中的所有標籤和排除項目，請選擇此選項。`ImageTagAlreadyExistsException` 如果您嘗試推送具有現有標籤的映像，Amazon ECR 會傳回 。此外，若要啟用幾個不可變標籤的標籤更新，請輸入標籤名稱或使用萬用字元 (\$1) 在**不可分割標籤排除文字方塊中比對多個類似的標籤**。

1. 對於 **Image scan settings** (映像掃描設定)，雖然您可以在儲存庫層級指定基本掃描的掃描設定，但最佳實務是在私有登錄檔層級指定掃描組態。在私有登錄檔層級指定掃描設定讓您能啟用增強型掃描或基本掃描，還能定義篩選條件來指定要掃描哪些儲存庫。如需詳細資訊，請參閱[掃描映像是否有 Amazon ECR 中的軟體漏洞](image-scanning.md)。

1. 對於 **Encryption settings** (加密設定)，這是一個僅能檢視的欄位，因為儲存庫建立後，就無法變更儲存庫的加密設定。

1. 選擇 **Save** (儲存) 更新儲存庫設定。

## 設定影像標籤可變性 (AWS CLI)
<a name="image-tag-mutability-cli"></a>

**建立儲存庫並設定不可變標籤**

使用以下其中一個命令來建立新的映像儲存庫，並設定不可變標籤。
+ [create-repository](https://docs.aws.amazon.com/cli/latest/reference/ecr/create-repository.html) (AWS CLI) 具有影像標籤可變性

  ```
  aws ecr create-repository --repository-name name --image-tag-mutability IMMUTABLE --region us-east-2
  ```
+ [create-repository](https://docs.aws.amazon.com/cli/latest/reference/ecr/create-repository.html) (AWS CLI) 搭配影像標籤可變性排除篩選條件

  ```
  aws ecr create-repository --repository-name name --image-tag-mutability IMMUTABLE_WITH_EXCLUSION --image-tag-mutability-exclusion-filters filterType=WILDCARD,filter=filter-text --region us-east-2
  ```
+ 具有映像標籤可變性的 [New-ECRRepository](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ECRRepository.html) (AWS Tools for Windows PowerShell)

  ```
  New-ECRRepository -RepositoryName name -ImageTagMutability IMMUTABLE -Region us-east-2 -Force
  ```
+ 具有影像標籤可變性排除篩選條件[的新 ECRRepository](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ECRRepository.html) (AWS Tools for Windows PowerShell)

  ```
  New-ECRRepository -RepositoryName name -ImageTagMutability IMMUTABLE_WITH_EXCLUSION -ImageTagMutabilityExclusionFilter @{FilterType=WILDCARD Filter=filter-text} -Region us-east-2 -Force
  ```

**更新儲存庫的映像標籤可變性設定**

使用以下其中一個命令來更新現有儲存庫的映像標籤可變性設定。
+ [ put-image-tag-mutability](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-image-tag-mutability.html) (AWS CLI) 具有影像標籤可變性

  ```
  aws ecr put-image-tag-mutability --repository-name name --image-tag-mutability IMMUTABLE --region us-east-2
  ```
+ [ put-image-tag-mutability](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-image-tag-mutability.html) (AWS CLI) 搭配影像標籤可變性排除篩選條件

  ```
  aws ecr put-image-tag-mutability --repository-name name --image-tag-mutability IMMUTABLE_WITH_EXCLUSION --image-tag-mutability-exclusion-filters filterType=WILDCARD,filter=latest --region us-east-2
  ```
+ [ Write-ECRImageTagMutability](https://docs.aws.amazon.com/powershell/latest/reference/items/Write-ECRImageTagMutability.html) (AWS Tools for Windows PowerShell) 具有影像標籤可變性

  ```
  Write-ECRImageTagMutability -RepositoryName name -ImageTagMutability IMMUTABLE -Region us-east-2 -Force
  ```
+ [ Write-ECRImageTagMutability](https://docs.aws.amazon.com/powershell/latest/reference/items/Write-ECRImageTagMutability.html) (AWS Tools for Windows PowerShell) 搭配影像標籤可變性排除篩選條件

  ```
  Write-ECRImageTagMutability -RepositoryName name -ImageTagMutability IMMUTABLE_WITH_EXCLUSION -ImageTagMutabilityExclusionFilter @{FilterType=WILDCARD Filter=latest}
  ```

# Amazon ECR 中的容器映像資訊清單格式支援
<a name="image-manifest-formats"></a>

Amazon ECR 支援以下的容器映像資訊清單格式：
+ Docker 映像資訊清單 V2 結構描述 1 (需搭配 1.9 或更舊版本的 Docker 使用)
+ Docker 映像資訊清單 V2 結構描述 2 (需搭配 1.10 或更新版本的 Docker 使用)
+ Open Container Initiative (OCI) 規格 (v1.0 和 v1.1)

Docker 映像資訊清單 V2 結構描述 2 支援提供下列功能：
+ 可在單數映像上使用多重標籤。
+ 支援儲存 Windows 容器映像。

## Amazon ECR 映像資訊清單轉換
<a name="image-manifest-conversion"></a>

推送映像至 Amazon ECR 及提取映像時，容器引擎用戶端 (例如 Docker) 會與登錄檔通訊，以取得一致同意用戶端支援且供登錄檔用於映像的資訊清單格式。

使用 Docker 1.9 或更早版本推送映像至 Amazon ECR 時，映像的資訊清單格式將存放為 Docker 映像資訊清單 V2 結構描述 1。使用 Docker 1.10 或更新版本推送映像至 Amazon ECR 時，映像的資訊清單格式將存放為 Docker 映像資訊清單 V2 結構描述 2。

當您*依標籤*從 Amazon ECR 提取映像時，Amazon ECR 會傳回存放在儲存庫中的映像資訊清單格式。只有在用戶端支援該格式，才會傳回該格式。如果客戶端不理解存放的映像資訊清單格式，Amazon ECR 會將映像資訊清單轉換為可以理解的格式。例如，如果 Docker 1.9 用戶端請求以 Docker 映像資訊清單 V2 結構描述 2 形式存放的映像資訊清單，Amazon ECR 會傳回在 Docker 映像資訊清單 V2 結構描述 1 格式中的資訊清單。下表描述透過*依標籤*提取映像時，Amazon ECR 支援的可用轉換：


| 用戶端要求的結構描述 | 以 V2 結構描述 1 推送至 ECR | 以 V2 結構描述 2 推送至 ECR | 以 OCI 推送至 ECR | 
| --- | --- | --- | --- | 
| V2 結構描述 1 | 不需翻譯 | 翻譯為 V2 結構描述 1 | 沒有可用的翻譯 | 
| V2 結構描述 2 | 不需翻譯，用戶端回退至 V2 結構描述 1 | 不需翻譯 | 翻譯為 V2 結構描述 2 | 
| OCI | 沒有可用的翻譯 | 翻譯為 OCI | 不需翻譯 | 

**重要**  
如果您*依摘要*提取映像，則沒有可用的翻譯。用戶端必須瞭解存放在 Amazon ECR 中的映像資訊清單格式。如果在 Docker 1.9 或更舊版本用戶端上依摘要要求 Docker 映像資訊清單 V2 結構描述 2 映像，映像提取將失敗。如需詳細資訊，請參閱 Docker 文件中的「[登錄檔相容性](https://docs.docker.com/registry/compatibility/)」。  
在此範例中，如果您*依標籤*要求相同的映像，Amazon ECR 則會將映像資訊清單翻譯為用戶端支援的格式。映像會提取成功。

# 將 Amazon ECR 映像與 Amazon ECS 搭配使用
<a name="ECR_on_ECS"></a>

您可以使用 Amazon ECR 私有儲存庫，來託管 Amazon ECS 任務可能從中提取的容器映像和成品。若要使用此功能，Amazon ECS 或 Fargate、容器代理程式必須具有進行 `ecr:BatchGetImage`、`ecr:GetDownloadUrlForLayer` 和 `ecr:GetAuthorizationToken` API 的許可。

## 所需的 IAM 許可
<a name="ECR_on_ECS_iampermissions"></a>

下表顯示了要針對每個啟動類型使用的 IAM 角色，這些角色為您的任務提供從 Amazon ECR 私有儲存庫提取所需的許可。Amazon ECS 提供受管 IAM 政策，其中包含必要許可。


****  

| 啟動類型 | IAM 角色 | AWS 受管 IAM 政策 | 
| --- | --- | --- | 
| Amazon EC2 執行個體上的 Amazon ECS |  使用容器執行個體 IAM 角色，此角色與 Amazon ECS 叢集中註冊的 Amazon EC2 執行個體相關聯。如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的[容器執行個體 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html)。  |  `AmazonEC2ContainerServiceforEC2Role` 如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的 [https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role)。  | 
|   Fargate 上的 Amazon ECS  |  使用您在 Amazon ECS 任務定義中參照的任務執行 IAM 角色。如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的[任務執行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。  |  `AmazonECSTaskExecutionRolePolicy` 如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的 [https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy)。  | 
|  外部執行個體上的 Amazon ECS  |  使用容器執行個體 IAM 角色，此角色與 Amazon ECS 叢集中註冊的內部部署伺服器或虛擬機器 (VM) 相關聯。如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的[容器執行個體 Amazon ECS 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html)。  |  `AmazonEC2ContainerServiceforEC2Role` 如需詳細資訊，請參閱*《Amazon Elastic Container Service 開發人員指南》*中的 [https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role)。  | 

**重要**  
 AWS 受管 IAM 政策包含您使用時可能不需要的其他許可。在此情況下，這些是從 Amazon ECR 私有儲存庫提取的最低必要許可。  

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        }
    ]
}
```

## 在 Amazon ECS 任務定義中指定 Amazon ECR 映像
<a name="ECR_on_ECS_taskdef"></a>

建立 Amazon ECS 任務定義時，您可以指定託管在 Amazon ECR 私有儲存庫中的容器映像。在任務定義中，確保您的 Amazon ECR 映像使用完整的 `registry/repository:tag` 名稱。例如 `aws_account_id.dkr.ecr.region.amazonaws.com``/my-repository:latest`。

下列任務定義片段會顯示您在 Amazon ECS 任務定義中，會用於指定 Amazon ECR 中託管的容器映像。

```
{
    "family": "task-definition-name",
    ...
    "containerDefinitions": [
        {
            "name": "container-name",
            "image": "aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:latest",
            ...
        }
    ],
    ...
}
```

# 將 Amazon ECR 映像與 Amazon EKS 搭配使用
<a name="ECR_on_EKS"></a>

您可以將 Amazon ECR 映像與 Amazon EKS 搭配使用。

從 Amazon ECR 參考映像時，您必須為映像使用完整的 `registry/repository:tag` 命名。例如 `aws_account_id.dkr.ecr.region.amazonaws.com``/my-repository:latest`。

## 所需的 IAM 許可
<a name="ECR_on_EKS_iampermissions"></a>

如果您的 Amazon EKS 工作負載託管在受管節點、自我管理節點或 上 AWS Fargate，請檢閱下列項目：
+ 託管在受管或自我管理節點上的 Amazon EKS 工作負載：需要 Amazon EKS 工作者節點 IAM 角色 (`NodeInstanceRole`)。Amazon EKS 工作節點 IAM 角色必須包含適用於 Amazon ECR 的下列 IAM 政策許可。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "ecr:BatchCheckLayerAvailability",
                  "ecr:BatchGetImage",
                  "ecr:GetDownloadUrlForLayer",
                  "ecr:GetAuthorizationToken"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

------
**注意**  
如果您使用 `eksctl`或 [Amazon EKS 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)中的 CloudFormation 範本來建立叢集和工作者節點群組，這些 IAM 許可預設會套用至工作者節點 IAM 角色。
+ 託管於 的 Amazon EKS 工作負載 AWS Fargate：使用 Fargate Pod 執行角色，該角色提供 Pod 從私有 Amazon ECR 儲存庫提取映像的許可。如需詳細資訊，請參閱[建立 Fargate Pod 執行角色](https://docs.aws.amazon.com/eks/latest/userguide/fargate-getting-started.html#fargate-sg-pod-execution-role)。

# 在 Amazon EKS 叢集上安裝 Helm Chart
<a name="using-helm-charts-eks"></a>

Amazon ECR 中託管的 Helm Chart 可以安裝在 Amazon EKS 叢集上。

**先決條件**
+ 安裝 Helm 用戶端的最新版本。這些步驟是使用 Helm 版本 `3.9.0` 進行編寫。如需詳細資訊，請參閱[安裝 Helm](https://helm.sh/docs/intro/install/)。
+ 您至少已將 AWS CLI 的版本 `1.23.9` 或 `2.6.3` 安裝在自己的電腦上。如需詳細資訊，請參閱[安裝或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ 您已經將 Helm Chart 推送到您的 Amazon ECR 儲存庫。如需詳細資訊，請參閱[將 Helm Chart 推送至 Amazon ECR 私有儲存庫](push-oci-artifact.md)。
+ 您已設定 `kubectl` 與 Amazon EKS 合作。如需詳細資訊，請參閱《Amazon EKS 使用者指南》****中的[為 Amazon EKS 建立 `kubeconfig`](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)。若下列命令在您的叢集上成功執行，就表示您的設定正確。

  ```
  kubectl get svc
  ```

**在 Amazon EKS 叢集上安裝 Helm Chart**

1. 對您的 Helm 用戶端驗證您的 Helm Chart 託管的 Amazon ECR 登錄檔。所用的每個登錄檔皆必須取得身分驗證字符，字符有效期間為 12 個小時。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔身分驗證](registry_auth.md)。

   ```
   aws ecr get-login-password \
        --region us-west-2 | helm registry login \
        --username AWS \
        --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

1. 安裝圖表。將 *helm-test-chart* 取代為您的儲存庫，將 *0.1.0* 取代為 Helm Chart 的標籤。

   ```
   helm install ecr-chart-demo oci://aws_account_id.dkr.ecr.region.amazonaws.com/helm-test-chart --version 0.1.0
   ```

   輸出看起來會與此類似：

   ```
   NAME: ecr-chart-demo
   LAST DEPLOYED: Tue May 31 17:38:56 2022
   NAMESPACE: default
   STATUS: deployed
   REVISION: 1
   TEST SUITE: None
   ```

1. 驗證圖表安裝。

   ```
   helm list -n default
   ```

   輸出範例：

   ```
   NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
   ecr-chart-demo  default         1               2022-06-01 15:56:40.128669157 +0000 UTC deployed        helm-test-chart-0.1.0   1.16.0
   ```

1. (選擇性) 請參閱已安裝的 Helm Chart `ConfigMap`。

   ```
   kubectl describe configmap helm-test-chart-configmap
   ```

1. 完成後，您可以從叢集中移除圖表版本。

   ```
   helm uninstall ecr-chart-demo
   ```