繁体   English   中英

将图像推送到 ECR,得到“Retrying in... seconds”

[英]Pushing an image to ECR, getting "Retrying in ... seconds"

我最近在 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

我想知道这是否与与此存储库关联的权限/策略有关。 现在没有附加到此存储库的语句。 那是缺少的部分吗? 如果是这样,该声明会是什么样子? 我试过这个,但没有效果:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPutImage",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789:root"
      },
      "Action": "ecr:PutImage"
    }
  ]
}

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

预先感谢您的建议。

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

"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"

请务必添加更多限制性主体。 我只是想看看在这种情况下权限是否是问题,而且确实是。

事实证明这是一个缺失/错误配置的策略。 通过使用AmazonEC2ContainerRegistryPowerUser托管策略添加角色,我能够使其在 CodeBuild 中工作:

new CodeBuildAction({
  actionName: "ApplicationBuildAction",
  input: this.applicationSourceOutput,
  outputs: [this.applicationBuildOutput],
  project: new PipelineProject(this, "ApplicationBuildProject", {
      vpc: this.codeBuildVpc,
      securityGroups: [this.codeBuildSecurityGroup],
      environment: {
        buildImage: LinuxBuildImage.STANDARD_5_0,
        privileged: true,
      },
      environmentVariables: {
        ECR_REPO_URI: {
          value: ECR_REPO_URI,
        },
        ECR_REPO_NAME: {
          value: ECR_REPO_NAME,
        },
        AWS_REGION: {
          value: this.region,
        }
      },
      buildSpec: BuildSpec.fromObject({
        version: "0.2",
        phases: {
          pre_build: {
            commands: [
              "echo 'Logging into Amazon ECR...'",
              "aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REPO_URI",
              "COMMIT_HASH=$(echo \"$CODEBUILD_RESOLVED_SOURCE_VERSION\" | head -c 8)"
            ]
          },
          build: {
            commands: [
              "docker build -t $ECR_REPO_NAME:latest ."
            ]
          },
          post_build: {
            commands: [
              "docker tag $ECR_REPO_NAME:latest $ECR_REPO_URI/$ECR_REPO_NAME:latest",
              "docker tag $ECR_REPO_NAME:latest $ECR_REPO_URI/$ECR_REPO_NAME:$COMMIT_HASH",
              "docker push $ECR_REPO_URI/$ECR_REPO_NAME:latest",
              "docker push $ECR_REPO_URI/$ECR_REPO_NAME:$COMMIT_HASH",
            ]
          }
        }
      }),
      // * * ADDED THIS ROLE HERE * *
      role: new Role(this, "application-build-project-role", {
        assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
        managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2ContainerRegistryPowerUser")]
      })
    }),
});

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

请务必添加特定委托人,即 IAM 用户/角色,以便仅允许这些用户/角色执行上述“操作”。 可以在Amazon ECR >> 存储库 >> Select 所需的存储库>> 权限 >> 编辑策略 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"
      ]
    }
  ]
}

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

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

就我而言,回购不是在 ECR 上创建的。 创建它修复它。

问题是您的 iam 用户无权完全访问 ecr,因此将以下策略附加到您的 iam 用户。

按照照片获取政策附件

对于遇到此问题的任何人,我的问题是在我的 AWS cli 中配置了错误的 AWS 配置文件/帐户。

运行aws configure并添加有权访问 ECR 存储库的帐户的密钥。

如果您有多个使用 cli 的 AWS 账户,请查看此解决方案

运行“docker push”时可能会看到相同的消息(循环中的“Retrying in... seconds”),而无需先在 ECR 中创建相应的 repo(在您的示例中为“myorg/myapp”)。 跑:

aws ecr create-repository --repository-name myorg/myapp --region us-west-2 

刚遇到这个问题。 这是与许可相关的。 就我而言,我使用的是 CDKv2,它承担了特定的角色来上传资产。 因为我部署的用户没有担任该角色的权限,所以它失败了。 提示是部署期间出现的这些警告消息:

current credentials could not be used to assume 'arn:aws:iam::12345:role/cdk-abcde1234-image-publishing-role-12345-ap-southeast-2', but are for the right account. Proceeding anyway.
current credentials could not be used to assume 'arn:aws:iam::12345:role/cdk-abcde1234-file-publishing-role-12345-ap-southeast-2', but are for the right account. Proceeding anyway.

是的,更新您的 ECR 存储库上的权限会修复它,但由于 CDK 应该为您维护这个,正确的解决方案是允许您的用户承担 CDK 角色,这样您就不需要自己弄乱 ECR 权限。

在我的情况下,我通过授予资源arn:aws:iam::*:role/cdk-*sts:AssumeRole权限来做到这一点。 这允许我的用户同时承担文件上传角色和图像上传角色。

授予此权限后,无法承担角色的 CDK 错误消失了,我能够成功部署。

对我来说,问题是 ECR 上的存储库名称必须与我正在推送的应用程序/存储库的名称相同。 在这里尝试了所有修复,没有工作。 这做到了!

浏览 ECR -> 存储库 -> 权限

编辑 JSON 策略。

添加这些操作。

"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"

并在资源中添加“*”。

保存。

一切顺利,现在您可以将映像推送到 ECR。

如果您的帐户上有 MFA 强制执行政策,那可能是问题所在,因为您必须拥有令牌才能采取行动。 查看此AWS 文档以在 CLI 上获取令牌。

我正在从 EC2 实例上传,但我没有为我的 awscli 指定区域,登录成功但 docker push 命令一直在重试,我在 ECR 回购端设置了正确的权限

这条线为我解决了这个问题

aws configure set default.region us-west-1

就我而言,我使用了错误的 AWS 凭据,使用正确的凭据进行aws configure解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM