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