当在 CodeBuild 中使用 Docker 映像时,如何解决“提取映像配置时出错:请求过多”错误?

上次更新日期:2020 年 11 月 19 日

我想解决在 AWS CodeBuild 中使用 Docker 映像时遇到的“提取映像配置时出错:请求过多”错误。

简短描述

如果您在 CodeBuild 中使用 Docker 映像,则当您从公共 DockerHub 存储库中提取层时,可能会遇到限制。

要解决在遇到限制时收到的错误,必须将 CodeBuild 配置为使用 DockerHub 账户凭证对层提取进行身份验证。

重要提示:要完成以下步骤,您必须拥有 DocckerHub 账户以及账户的用户名和密码。

解决方法

使用 AWS Secrets Manager 存储 DockerHub 凭证

1.    打开 Secret Manager 控制台

2.    选择 Store a new secret(存储新密钥)

3.    在 Select secret type(选择密钥类型)部分,选择 Other type of secrets(其他类型的密钥)

4.    在 Specify the key/value pairs to be stored in this secret(指定此密钥中存储的键/值对)部分,选择 Secret key/value(密钥键/值)选项卡。

5.    在第一个文本框中,输入用户名。在第二个文本框中,输入您的 DockerHub 用户名。然后,选择 Add row(添加行)

6.    在新行的第一个文本框中,输入密码。在第二个文本框中,输入您的 DockerHub 密码。然后,选择 Add row(添加行)

7.    选择下一步

8.    对于 Secret name(密钥名称),输入您的密钥的名称。例如:dockerhub

9.    选择 Next

10.    确认选择了 Disable automatic rotation(禁用自动旋转)的默认设置。

11.    选择下一步

12.    选择 Store(存储)

13.    从 Secret name(密钥名称)列中,选择您的密钥。

14.    在 Secret details(密钥详细信息)部分,请记下 Amazon Resource Name (ARN) 以作为密钥 ARN

解决预置阶段出现的限制问题

1.    打开 CodeBuild 控制台

2.    在导航窗格中,选择 Build(生成),然后选择 Build projects(生成项目)

3.    选择您的生成项目。

4.    选择 Edit(编辑),然后选择 Environment(环境)

5.    选择 Override image(覆盖映象)

6.    对于 New environment image(新环境映像),选择 Custom image(自定义映像)

7.    对于 Environment type(环境类型),选择自定义映像。

8.    对于 Image registry(映像注册表),选择 Other registry(其他注册表)

9.    对于 External registry URL(外部注册表 URL),输入 Docker 映像的名称。

10.    对于 Registry credential(注册表凭证),输入您之前记下的密钥 ARN。

11.    选择 Update environment(更新环境)

解决其他阶段出现的限制问题

您必须向 CodeBuild 服务角色授予 AWS Identity and Access Management (IAM) 权限才能访问密钥。

1.    打开 CodeBuild 控制台

2.    在导航窗格中,选择 Build(生成),然后选择 Build projects(生成项目)

3.    选择您的生成项目。

4.    选择 Build details(生成详细信息)选项卡。

5.    在 Environment(环境)部分,对于 Service role(服务角色),选择服务角色 ARN。这将打开 IAM 控制台。

6.    在 Permissions(权限)选项卡中,选择 Add inline policy(添加内联策略)

7.    选择 JSON 选项卡。

8.    将文本编辑器的代码替换为以下 IAM 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "YOUR_SECRET_ARN*"
            ]
        }
    ]
}

注意:在前面的代码中,将 YOUR_SECTRET_ARN 替换为您之前记下的密钥 ARN。

9.    选择查看策略

10.    在 Name(名称)字段中输入策略名称。例如:dockerhub_secret_access

11.    选择 Create policy(创建策略)

配置 CodeBuild 以检索密钥

1.    打开 CodeBuild 控制台

2.    在导航窗格中,选择 Build(生成),然后选择 Build projects(生成项目)

3.    选择您的生成项目。

4.    选择 Edit(编辑),然后选择 Environment(环境)

5.    展开 Additional configuration(其他配置)部分。

6.    要添加环境变量,在 Environment(环境)变量部分的 Name(名称)中输入 dockerhub_username

7.    对于 Value(值),输入密钥的名称,然后输入 :username。例如:dockerhub:username

8.    对于 Type(类型),选择 Secrets Manager

9.    要添加下一个环境变量,选择 Add environment variable(添加环境变量)

10.    对于 Name(名称),输入 dockerhub_password

11.    对于 Value(值),输入密钥的名称,然后输入 :password。例如:dockerhub:password

12.    对于 Type(类型),选择 Secrets Manager

13.    选择 Update environment(更新环境)

14.    在执行任何其他 Docker 操作之前,修改您的构建规范并添加以下命令:

docker login -u $dockerhub_username -p $dockerhub_password

例如:

version: 0.2

phases:
  install:
    commands:
      - docker login -u $dockerhub_username -p $dockerhub_password
 
  build:
    commands:
      - docker pull docker:dind

这篇文章对您有帮助吗?


您是否需要账单或技术支持?