Docker 推送到 AWS ECR 私有存储库失败,JSON 格式错误

Posted

技术标签:

【中文标题】Docker 推送到 AWS ECR 私有存储库失败,JSON 格式错误【英文标题】:Docker push to AWS ECR private repo failing with malformed JSON 【发布时间】:2016-03-29 04:36:00 【问题描述】:

我正在试用 AWS ECR 并将新标签推送到我们的私有存储库。

它是这样的:

export DOCKER_REGISTRY=0123123123123.dkr.ecr.us-east-1.amazonaws.com
export TAG=0.1
docker build -t vendor/app-name .
`aws ecr get-login --region us-east-1`" # generates docker login
docker tag vendor/app-name $DOCKER_REGISTRY/vendor/app-name:$TAG
docker push $DOCKER_REGISTRY/vendor/app-name:$TAG

登录成功,标签已创建,我看到它带有docker images,但推送失败。

The push refers to a repository [0123123123123.dkr.ecr.us-east-1.amazonaws.com/vendor/app-name] (len: 2)
b1a1d76b9e52: Pushing [==================================================>]     32 B/32 B
Error parsing HTTP response: unexpected end of JSON input: ""

这很可能是配置错误,但我不知道如何从中获得更多输出。该命令没有调试级别选项,没有其他日志,而且我无法拦截网络流量,因为它似乎已加密。

【问题讨论】:

“vendor”或“app-name”中是否有特殊字符? (假设这些不是您使用的真实值)我会尝试一个没有连字符、下划线等的快速测试...... 我选择了与我们匹配的那些泛型,vendor 是我们的公司名称(只有小写字母),app-name 两个单词之间有一个破折号。我刚刚尝试了供应商/应用程序名称,这是相同的场景 Travis 和本地也会发生这种情况 版本呢? ECR 使用注册表 v2,(我认为)它在 1.5 中被引入 docker。客户是否有可能是 1.4 岁或以上? 好主意,不幸的是:$ docker --version Docker 版本 1.8.1,构建 d12ea79 【参考方案1】:

遇到了同样的问题。对我来说,确保我推送的 IAM 用户拥有 ecr:BatchCheckLayerAvailability 权限,从而解决了这个问题。

我原本打算制定“仅推送”策略,但没有意识到成功推送需要此权限。

【讨论】:

现场,谢谢!错误信息太糟糕了【参考方案2】:

除了@Ethan 的回答:我试图找到将 docker 映像推送到 AWS 注册表所需的最小权限集。截至今天,最小集是:

    
        "Sid": "PushToEcr",
        "Effect": "Allow",
        "Action": [
            "ecr:BatchCheckLayerAvailability",
            "ecr:CompleteLayerUpload",
            "ecr:GetAuthorizationToken",
            "ecr:InitiateLayerUpload",
            "ecr:PutImage",
            "ecr:UploadLayerPart"
        ],
        "Resource": "*"
    

据我了解,Resource 必须是 *,因为其中一些操作在其他情况下不起作用。 欢迎改进!

【讨论】:

唯一需要 * 的是 GetAuthorizationToken -- 其余的 * 是合群的。【参考方案3】:

您需要的最低限度政策:


  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "",
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    ,
    
      "Sid": "",
      "Effect": "Allow",
      "Action": [
        "ecr:UploadLayerPart",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:CompleteLayerUpload",
        "ecr:BatchCheckLayerAvailability"
      ],
      "Resource": "arn:aws:ecr:<your region>:<your account id>:repository/<your repository name>"
    
  ]

【讨论】:

以上是关于Docker 推送到 AWS ECR 私有存储库失败,JSON 格式错误的主要内容,如果未能解决你的问题,请参考以下文章

将 docker 容器从本地推送到 aws ecr

Gitlab CI - Docker 推送到 AWS ECR

AWS ECR GetAuthorizationToken 问题

Github 操作将 docker 部署到 AWS ECS ECR

Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用

AWS ECR Repository - 如何从一个账户复制图像并推送到另一个账户