将图像推送到 ECR,得到“在...秒后重试”

e-e*_*e-e 72 docker amazon-ecr

我最近在 AWS ECR 中创建了一个新存储库,并尝试推送图像。我正在复制/粘贴通过存储库页面上的“查看推送命令”按钮提供的说明。我将其复制到此处以供参考:

  1. aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-west-2.amazonaws.com

(“登录成功”)

  1. docker build -t myorg/myapp .

  2. docker tag myorg/myapp:latest 123456789.dkr.ecr.us-west-2.amazonaws.com/myorg/myapp:latest

  3. docker push 123456789.dkr.ecr.us-west-2.amazonaws.com/myorg/myapp:latest

然而,当我到达这docker push一步时,我看到:

> docker push 123456789.dkr.ecr.us-west-2.amazonaws.com/myorg/myapp:latest
The push refers to repository [123456789.dkr.ecr.us-west-2.amazonaws.com/myorg/myapp]

a53c8ed5f326: Retrying in 1 second 
78e16537476e: Retrying in 1 second 
b7e38d172e62: Retrying in 1 second 
f1ff72b2b1ca: Retrying in 1 second 
33b67aceeff0: Retrying in 1 second 
c3a550784113: Waiting 
83fc4b4db427: Waiting 
e8ade0d39f19: Waiting 
487d5f9ec63f: Waiting 
b24e42eb9639: Waiting 
9262398ff7bf: Waiting 
804aae047b71: Waiting 
5d33f5d87bf5: Waiting 
4e38024e7e09: Waiting
EOF
Run Code Online (Sandbox Code Playgroud)

我想知道这是否与此存储库关联的权限/策略有关。目前该存储库没有附加任何声明。这是缺失的部分吗?如果是这样,该声明会是什么样子?我已经尝试过这个,但没有效果:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPutImage",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789:root"
      },
      "Action": "ecr:PutImage"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

奖励积分:我最终想在 CDK CodeBuildAction 中使用它。我遇到了与上面相同的错误,所以我检查一下我在本地终端中是否得到了相同的结果,我就是这样。因此,如果策略声明需要不同才能在 CDK CodeBuildAction 中使用,那么这些详细信息也将受到赞赏。

预先感谢您的建议和建议。

小智 51

当我尝试使用 AWS 和 Docker CLI 手动上传图像时,我遇到了同样的问题。我可以通过进入 ECR -> 存储库 -> 权限然后添加新的策略声明和principal:*以下操作来修复它:

"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
Run Code Online (Sandbox Code Playgroud)

请务必添加更多限制性原则。我只是想看看在这种情况下权限是否是问题所在,果然确实如此。


Dun*_*gor 48

当 ECR 中不存在存储库时,我遇到了这个问题 - 我认为推送会创建它,但事实并非如此。

在推送之前创建它解决了问题。


Vis*_*M.R 34

接受的答案可以正确解决问题。然而,正如答案中所提到的,允许principal:*是有风险的,并且可能会使您的 ECR 受到损害。

请务必添加特定主体,即 IAM 用户/角色,以便仅允许这些用户/角色执行上述“操作”。可以在Amazon ECR >> 存储库 >>选择所需存储库>> 权限 >> 编辑策略 JSON中添加以下 JSON 策略以快速解决此问题:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AccountNumber>:role/<RoleName>"
      },
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:CompleteLayerUpload",
        "ecr:GetDownloadUrlForLayer",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)


Dey*_*ong 8

就我而言,存储库不是在 ECR 上创建的。创建它修复了它。


小智 6

在运行“docker Push”时,如果没有首先在 ECR 中创建相应的存储库(示例中为“myorg/myapp”),则可能会看到相同的消息(循环中的“Retrying in ... Seconds”)。跑步:

aws ecr create-repository --repository-name myorg/myapp --region us-west-2 
Run Code Online (Sandbox Code Playgroud)