私有注册表身份验证 - Amazon ECR

私有注册表身份验证

可以使用 AWS Management Console、AWS CLI 或 AWS 开发工具包来创建和管理私有存储库。也可以使用这些方法对镜像执行某些操作,例如列出或删除镜像。这些客户端使用标准 AWS 身份验证方法。尽管在技术上可以使用 Amazon ECR API 推送和提取镜像,但您更有可能使用 Docker CLI 或特定语言的 Dockerf 库。

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

我们提供以下各节详细介绍的注册表身份验证方法。

使用 Amazon ECR 凭证辅助程序

Amazon ECR 提供了 Docker 凭证辅助程序,这使得在 Amazon ECR 中推送和提取镜像时更容易存储和使用 Docker 凭证。有关安装和配置步骤,请参阅 Amazon ECR Docker 凭证辅助程序

注意

目前,Amazon ECR Docker 凭证助手不支持多重身份验证 (MFA)。

使用授权令牌

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

使用 CLI 为 Amazon ECR 私有注册表验证 Docker

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

重要

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

  • 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 (AWS Tools for Windows PowerShell)

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

使用 HTTP API 身份验证

Amazon ECR 支持 Docker 注册表 HTTP API。但是,由于 Amazon ECR 属于私有注册表,因此您必须为每个 HTTP 请求提供授权令牌。您可以通过使用 curl-H 选项来添加 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 变量传递到 curl 命令的 -H 选项。例如,以下命令会列出 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"]}