

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 映像存储库的身份验证
<a name="docker-configuration.remote-repo"></a>

本主题介绍如何使用 Elastic Beanstalk 对在线映像存储库进行身份验证。对于私有存储库，Elastic Beanstalk 必须先进行身份验证，然后才能拉取和部署您的映像。对于 Amazon ECR Public，身份验证是可选项，但提供了更宽松的速率限制和更高的可靠性。

## 使用 Amazon ECR 存储库中的映像
<a name="docker-images-ecr"></a>

您可以使用[亚马逊弹性容器注册表 (Amazon](https://aws.amazon.com/ecr) ECR) 存储您的自定义 Docker 镜像。 AWS 

当您将 Docker 映像存储在 Amazon ECR 中时，Elastic Beanstalk 会自动使用您环境的[实例配置文件](concepts-roles-instance.md)向 Amazon ECR 注册表进行身份验证。因此，您需要为您的实例提供访问 Amazon ECR 存储库中的映像的权限。为此，请将 [Amazon EC2 ContainerRegistryReadOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ContainerRegistryReadOnly.html) 托管策略附加到实例配置文件中，为环境的实例配置文件添加权限。这提供了对您账户中所有 Amazon ECR 存储库的只读访问权限。您还可以选择仅使用以下模板创建自定义策略来访问单个存储库：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEbAuth",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "AllowPull",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ecr:us-east-2:111122223333:repository/repository-name"
            ],
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:BatchGetImage"
            ]
        }
    ]
}
```

------

将上述策略中的 Amazon Resource Name (ARN) 替换为存储库的 ARN。

您需要在 `Dockerrun.aws.json` 文件中指定映像息。根据您使用的平台，配置会有所不同。

对于 [ECS 托管 Docker平台](create_deploy_docker_v2config.md)，请在容器定义对象 **** 中使用 `image` 键：

```
"containerDefinitions": [
        {
        "name": "my-image",
        "image": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",
```

对于 [Docker 平台](single-container-docker-configuration.md)，请通过 URL 引用映像。URL 位于您的 `Dockerrun.aws.json` 文件的 `Image` 定义中：

```
  "Image": {
      "Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",
      "Update": "true"
    },
```

## 使用 AWS Secrets Manager
<a name="docker-configuration.remote-repo.secrets"></a>

将 Elastic Beanstalk 配置为在部署之前对私有存储库进行身份验证，以允许对容器映像的访问。

此方法使用 Elastic Beanstalk 部署过程的*预构建*阶段，其中包含两个组件：
+ [ebextensions](ebextensions.md)，用于定义存储存储库凭证的环境变量
+ [平台钩子脚本](platforms-linux-extend.hooks.md)，用于在拉取映像之前执行 **docker login**

钩子脚本从环境变量中检索用户名和密码，这些变量是从 JSON 格式的单个 AWS Secrets Manager 密钥中填充的。[此功能需要在 2026 年 1 月 13 日当天或之后发布的 Elastic Beanstalk Docker 和 ECS 托管 Docker 平台。](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2026-01-13-al2023.html)有关更多详细信息，请参阅[环境密钥](AWSHowTo.secrets.env-vars.md)。

**要将 Elastic Beanstalk 配置为使用您的私有存储库进行身份验证 AWS Secrets Manager**
**注意**  
在继续操作之前，请确保您已在中设置证书 AWS Secrets Manager 并配置了必要的 IAM 权限。有关详细信息，请参阅[将密钥配置为环境变量的先决条件](AWSHowTo.secrets.env-vars.md#AWSHowTo.secrets.configure-env-vars.prerequisites)。

1. 为您的项目创建以下目录结构：

   ```
   ├── .ebextensions
   │   └── env.config
   ├── .platform
   │   ├── confighooks
   │   │   └── prebuild
   │   │       └── 01login.sh
   │   └── hooks
   │       └── prebuild
   │           └── 01login.sh
   ├── Dockerfile
   ```

1. 用于[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)将私有仓库的凭据保存为 JSON 格式的密钥。

   ```
   aws secretsmanager create-secret --name repo-credentials \
       --secret-string '{"username":"myuser","password":"mypassword"}'
   ```

1. 创建以下 `env.config` 文件并将其放在 `.ebextensions` 目录中，如前面的目录结构所示。此配置使用带有 [JSON 密钥提取](AWSHowTo.secrets.env-vars.md#AWSHowTo.secrets.json)功能的[aws:elasticbeanstalk:application:environmentsecrets](command-options-general.md#command-options-general-elasticbeanstalk-application-environmentsecrets)命名空间从密钥中的各个字段初始化`USER`和 `PASSWD` Elastic Beanstalk 环境变量。

   ```
   option_settings:
     aws:elasticbeanstalk:application:environmentsecrets:
       USER: arn:aws:secretsmanager:us-east-1:111122223333:secret:repo-credentials-AbCd12:username
       PASSWD: arn:aws:secretsmanager:us-east-1:111122223333:secret:repo-credentials-AbCd12:password
   ```

1. 创建以下`01login.sh`脚本文件并将其放在以下位置（也显示在前面的目录结构中）：
   + `.platform/confighooks/prebuild/01login.sh`
   + `.platform/hooks/prebuild/01login.sh`

   ```
   #!/bin/bash
   echo $PASSWD | docker login -u $USER --password-stdin
   ```

   该`01login.sh`脚本使用在**步骤 3** 中配置的环境变量，并将密码传递给 **docker login** via `stdin`。有关 Docker 身份验证的更多信息，请参阅 Docker 文档中的 [docker login](https://docs.docker.com/engine/reference/commandline/login/)。
**注意**  
ECS 托管 Docker 平台使用原生 ECS 语法来引用密钥。有关更多信息，请参阅亚马逊*弹性容器服务开发人员指南*[中的通过 Amazon ECS 环境变量传递 Secrets Manager 密钥](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/secrets-envvar-secrets-manager.html)。
有关平台挂钩的更多信息，请参阅*扩展 Elastic Beanstalk Linux* 平台[平台挂钩](platforms-linux-extend.hooks.md)中的。

配置身份验证后，Elastic Beanstalk 可以从私有存储库拉取和部署映像。

## 使用 `Dockerrun.aws.json` 文件
<a name="docker-configuration.remote-repo.dockerrun-aws"></a>

本节介绍向私有存储库验证 Elastic Beanstalk 的另一种方法。使用此方法，您可以使用 Docker 命令生成身份验证文件，然后将身份验证文件上传到 Amazon S3 存储桶。您还必须在 `Dockerrun.aws.json` 文件中包含存储桶信息。

**生成身份验证文件并提供给 Elastic Beanstalk**

1. 使用 **docker login** 命令生成身份验证文件。对于 Docker Hub 上的存储库，请运行 **docker login**：

   ```
   $ docker login
   ```

   对于其他注册表，请包括注册表服务器的 URL：

   ```
   $ docker login registry-server-url
   ```
**注意**  
如果您的 Elastic Beanstalk 环境使用 Amazon Linux AMI Docker 平台版本（在 Amazon Linux 2 之前），请阅读[Amazon Linux AMI（在 Amazon Linux 2 之前）上的 Docker 配置](create_deploy_docker.container.console.md#docker-alami)中的相关信息。

   有关身份验证文件的更多信息，请参阅 Docker 网站上的[在 Docker Hub 上存储映像](https://docs.docker.com/docker-hub/repos/)和 [docker login](https://docs.docker.com/engine/reference/commandline/login/)。

1. 将名为 `.dockercfg` 的身份验证文件的副本上传到安全的 Amazon S3 存储桶。
   + Amazon S3 存储桶的托管环境必须与使用它的环境 AWS 区域 相同。Elastic Beanstalk 无法从托管在其他区域的 Amazon S3 存储桶下载文件。
   + 在实例配置文件中授予 IAM 角色执行 `s3:GetObject` 操作的权限。有关更多信息，请参阅[管理 Elastic Beanstalk 实例配置文件](iam-instanceprofile.md)。

1. 在 `Authentication` 文件的 `Dockerrun.aws.json` 参数中包含 Amazon S3 存储桶信息。

   下面的示例演示了 `amzn-s3-demo-bucket` 存储桶中一个名为 `mydockercfg` 的身份验证文件如何使用第三方注册表中的私有映像。有关 `AWSEBDockerrunVersion` 的正确版本号，请参阅示例后面的注释。

   ```
   {
     "AWSEBDockerrunVersion": "version-no",
     "Authentication": {
       "Bucket": "amzn-s3-demo-bucket",
       "Key": "mydockercfg"
     },
     "Image": {
       "Name": "quay.io/johndoe/private-image",
       "Update": "true"
     },
     "Ports": [
       {
         "ContainerPort": "1234"
       }
     ],
     "Volumes": [
       {
         "HostDirectory": "/var/app/mydb",
         "ContainerDirectory": "/etc/mysql"
       }
     ],
     "Logging": "/var/log/nginx"
   }
   ```
**`Dockerrun.aws.json` 版本**  
 `AWSEBDockerrunVersion` 参数指示 `Dockerrun.aws.json` 文件的版本。  
Docker AL2 AL2023 和平台使用以下版本的文件。  
`Dockerrun.aws.json v3` — 使用 Docker Compose 的环境。
`Dockerrun.aws.json v1` — 不使用 Docker Compose 的环境。
*在 Amazon Linux 2 上运行*的 *ECS 和在上面运行*的 ECS AL2023 使用该`Dockerrun.aws.json v2`文件。已停用的平台 *ECS 多容器 Docker Amazon Linux AMI (AL1)* 也使用了相同的版本。

在 Elastic Beanstalk 可以使用托管私有存储库的在线注册表进行身份验证之后，可以部署和提取您的映像。

## 使用来自 Amazon ECR Public 的映像
<a name="docker-images-ecr-public"></a>

Amazon ECR Public 是一个托管 Docker 映像的公共容器注册表。虽然 Amazon ECR Public 存储库可公开访问，但身份验证为您的部署提供了更宽松的速率限制和更好的可靠性。

**注意**  
中国地区 () 和 AWS GovCloud 地区 (`cn-*`) 不支持 Amazon ECR 公共身份验证。`us-gov-*`在这些区域中，Elastic Beanstalk 会使用未经身份验证的拉取。

要启用 Amazon ECR Public 身份验证，请在您环境的[实例配置文件](concepts-roles-instance.md)中添加以下权限。有关 Amazon ECR Public 的更多信息，请参阅《Amazon Elastic Container Registry Public User Guide》**中的 [Registry authentication in Amazon ECR public](https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html)。

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

****  

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

------

将这些权限附加到您的实例配置文件后，Elastic Beanstalk 会自动对 Amazon ECR Public 注册表进行身份验证。您可以使用 `Dockerrun.aws.json` 文件或 Dockerfile 中的标准 `public.ecr.aws/registry-alias/repository-name:tag` 格式引用 Amazon ECR Public 映像。