私有注册表身份验证 - Amazon ECR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

私有注册表身份验证

您可以使用 AWS 管理控制台、 AWS CLI或 AWS SDKs 创建和管理私有存储库。也可以使用这些方法对映像执行某些操作,例如列出或删除映像。这些客户端使用标准 AWS 身份验证方法。即使您可以使用 Amazon ECR API 推送和拉取映像,您也更有可能使用 Docker CLI 或特定于语言的 Docker 库。

Docker CLI 不支持本机IAM身份验证方法。必须执行其他步骤, 以便 Amazon ECR 可以对 Docker 推送和拉取请求进行身份验证和授权。

以下部分详细介绍的注册表身份验证方法可供使用。

使用Amazon ECR凭证辅助程序

Amazon ECR 提供了一个 Docker 凭证辅助程序,该辅助程序使在将映像推送和拉取到 时存储和使用 Docker 凭证变得更加轻松Amazon ECR。有关安装和配置步骤,请参阅 Amazon ECR Docker 凭据辅助程序.

使用授权令牌

授权令牌的权限范围与用于检索身份验证令牌的IAM委托人的权限范围匹配。身份验证令牌用于访问您的Amazon ECR委托人有权访问且有效期为 12 小时的任何IAM注册表。要获取授权令牌,您必须使用 GetAuthorizationToken API 操作检索包含用户名AWS和编码密码的 base64 编码的授权令牌。该 AWS CLI get-login-password 命令可以通过检索和解码授权令牌来简化此操作,然后您可以将授权令牌传送到 docker login 命令中进行身份验证。

要使用 get-login-password 针对 Amazon ECR 注册表验证 Docker,请运行 aws ecr get-login-password 命令。将身份验证令牌传递给 docker login 命令时,将值 AWS 用作用户名,并指定要对其进行身份验证的 Amazon ECR 注册表 URI。如果对多个注册表进行身份验证,则必须针对每个注册表重复该命令。

重要

如果收到错误,请安装或更新到最新版本的 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS 命令行界面

  • get-login-password (AWS CLI)

    aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  • Get-ECRLoginCommand (适用于 Windows PowerShell 的 AWS 工具)

    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

使用 1.17.10 之前的 AWS CLI 版本时,get-login 命令可用于对您的 Amazon ECR 注册表进行身份验证。可以使用 aws --version 命令查看 AWS CLI 版本。

  1. 运行 aws ecr get-login 命令。以下示例适用于与创建请求的账户关联的默认注册表。要访问其他账户注册表,请使用 --registry-ids aws_account_id 选项。有关更多信息,请参阅 AWS CLI Command Reference 中的 get-login

    aws ecr get-login --region region --no-include-email

    结果输出是 docker login 命令,此命令可用于对 Amazon ECR 注册表验证 Docker 客户端。

    docker login -u AWS -p password https://aws_account_id.dkr.ecr.region.amazonaws.com
  2. docker login 命令复制并粘贴到终端,授权您的 Docker CLI 访问注册表。此命令提供一个授权令牌,此令牌在 12 小时内对指定注册表有效。

    注意

    如果使用的是 Windows PowerShell,复制并粘贴这样的长字符串将不起作用。请使用以下命令。

    Invoke-Expression -Command (Get-ECRLoginCommand -Region region).Command
    重要

    在您执行此 docker login 命令时,系统上的其他用户可以在进程列表 (ps -e) 显示中看到该命令字符串。由于 docker login 命令包含身份验证凭证,因此系统上的其他用户可按此方式查看凭证会带来风险。他们可能会使用凭证获取对您的存储库的推送和拉取访问权限。如果您所在的系统不安全,则应考虑此风险,并通过省略 -p password 选项并在系统提示时输入密码来以交互方式登录。

使用 HTTP API 身份验证

Amazon ECR 支持 Docker 注册表 HTTP API. 但是,由于 Amazon ECR 属于私有镜像仓库,因此您必须为每个 HTTP 请求提供授权令牌。您可以通过使用 -Hcurl 选项来添加 HTTP 授权标头,以传递由 get-authorization-token AWS CLI 命令提供的授权令牌。

使用 Amazon ECR HTTP API 进行身份验证

  1. 使用 AWS CLI 检索授权令牌并将其设置为环境变量。

    TOKEN=$(aws ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
  2. 要对 API 进行身份验证,请将 $TOKEN 变量传递到 的 -H 选项curl。 例如,以下命令列出 Amazon ECR 存储库中的映像标签。有关更多信息,请参阅 Docker 注册表 HTTP API 参考文档。

    curl -i -H "Authorization: Basic $TOKEN" https://aws_account_id.dkr.ecr.region.amazonaws.com/v2/amazonlinux/tags/list

    您可以在一个 (扩展) 代码行中执行所有这些操作:

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Date: Thu, 04 Jan 2018 16:06:59 GMT
    Docker-Distribution-Api-Version: registry/2.0
    Content-Length: 50
    Connection: keep-alive
    
    {"name":"amazonlinux","tags":["2017.09","latest"]}