Docker 推送到 AWS ECR 问题

Posted

技术标签:

【中文标题】Docker 推送到 AWS ECR 问题【英文标题】:Docker push to AWS ECR issue 【发布时间】:2019-07-24 21:11:27 【问题描述】:

几天来,我遇到了将图像从 jenkins 推送到 ECR 并重新启动服务的问题。

我的 Jenkins 实例通过 ECS 托管在 EC2 实例上。 (它也被构建为 docker 镜像)。

我想要做的是构建图像,登录到 ECR,将图像推送到那里并重新启动服务。登录 ECR 有问题:

    当我“取消设置 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”时 “aws ecr get-login --region us-east-1”命令成功但推送 图像因“没有基本身份验证凭据”而停止。 当我不调用“unset AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”时,我 甚至无法登录 ECR。

我做了很多谷歌搜索和分析,但找不到任何答案。 任何想法可能导致问题?是 IAM 设置还是 ecs-agent 的东西?

用于运行 jenkins 任务的策略:


"Version": "2012-10-17",
"Statement": [
    
        "Action": [
            "ecr:GetAuthorizationToken"
        ],
        "Resource": "*",
        "Effect": "Allow",
        "Sid": "GetAuthorizationToken"
    ,
    
        "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
        ],
        "Resource": [
            "arn:aws:ecr:*:*:repository/salesiq*",
            "arn:aws:ecr:*:*:repository/comhub*",
            "arn:aws:ecr:*:*:repository/s-s-rt*",
            "arn:aws:ecr:*:*:repository/reveal*",
            "arn:aws:ecr:*:*:repository/se-*"
        ],
        "Effect": "Allow",
        "Sid": "EcrManagement"
    ,
    
        "Condition": 
            "ArnLike": 
                "ecs:cluster": [
                    "arn:aws:ecs:*:*:cluster/salesiq*",
                    "arn:aws:ecs:*:*:cluster/comhub*",
                    "arn:aws:ecs:*:*:cluster/s-s-rt*",
                    "arn:aws:ecs:*:*:cluster/reveal*",
                    "arn:aws:ecs:*:*:cluster/se-*"
                ]
            
        ,
        "Action": [
            "ecs:RunTask",
            "ecs:StartTask",
            "ecs:StopTask",
            "ecs:DescribeClusters",
            "ecs:DescribeServices",
            "ecs:ListClusters",
            "ecs:DescribeContainerInstances",
            "ecs:StopTask"
        ],
        "Resource": "*",
        "Effect": "Allow",
        "Sid": "EcsManagement"
    ,
    
        "Action": [
            "ecs:List*",
            "ecs:Describe*",
            "ecr:Describe*",
            "ecr:Get*",
            "ecr:Describe*",
            "ecr:List*",
            "cloudwatch:Get*",
            "cloudwatch:List*",
            "cloudwatch:Describe*",
            "ecs:UpdateService"
        ],
        "Resource": "*",
        "Effect": "Allow",
        "Sid": "EcsListing"
    
]

【问题讨论】:

您的构建 docker 容器是否具有使用 ECR 的 IAM 权限?以下是几个 ECR 策略示例:docs.aws.amazon.com/AmazonECR/latest/userguide/… 是的,这些都是附加到分配给詹金斯容器的“任务角色”的角色的所有策略。 awsiam-sauce awsiam-sauce-the-sequel cloudwatch-logging dynamodb-access ecr-ecs-policy lambda-access s3-access sns-access sqs-access 从上面的列表中仔细检查ecr-ecs-lambda 下的政策会很有趣 【参考方案1】:

我认为您可能缺少的是命令docker login 命令本身。您的问题中没有提到。所以你需要以下内容;

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

然后你想执行上面命令的输出;

    docker login -u AWS -p password https://aws_account_id.dkr.ecr.us-east-1.amazonaws.com

您也可以运行;

    $(aws ecr get-login --no-include-email --region eu-west-1)

然后

    docker push $ecr_repo:latest

我在管道中运行的 bash 脚本示例;

    #!/bin/bash
    set -ex

    # $branch: current git branch
    # $commit: hash of the current git commit
    # $ecr_repo: Self explanatory

    $(aws ecr get-login --no-include-email --region eu-west-1)
    docker pull $ecr_repo:latest
    docker build --cache-from $ecr_repo:latest -t image_name .
    docker tag image_name:latest $ecr_repo:$commit
    if [ "$branch" = "master" ]; then
      docker tag image_name:latest $ecr_repo:latest
      docker push $ecr_repo:latest
    fi
    docker push $ecr_repo:$commit

【讨论】:

这是“aws ecr get-login --region us-east-1 --no-include-email”的响应:从容器角色检索凭据时出错:检索元数据时出错:收到非来自 ECS 元数据的 200 响应 (400):"code":"InvalidIdInRequest","message":"CredentialsV2Request: ID not found","HTTPErrorCode":400 但是当我做这样的事情时:“unset AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”我可以登录,但它在推送阶段失败 您是否为您的容器实例使用 Amazon ECS 优化的 AMI?另外,您能否将您的角色使用的信任政策附加到您的问题中?

以上是关于Docker 推送到 AWS ECR 问题的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI - Docker 推送到 AWS ECR

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

AWS ECR GetAuthorizationToken 问题

Github 操作将 docker 部署到 AWS ECS ECR

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

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