从jenkins docker ecs容器中访问ecr图像
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从jenkins docker ecs容器中访问ecr图像相关的知识,希望对你有一定的参考价值。
你好Jenkins / Docker专家 -
Stuff that is working:
使用here建议的方法,我能够在AWS ECS集群中运行Jenkins docker镜像。使用-v
卷安装到docker socket(/var/run/docker.sock
)和docker(/usr/bin/docker
)我也可以从Jenkins容器内部访问docker进程。
Stuff that isn't:
我面临的最后一个问题是将图像拉入/拉出AWS ECR Registry。当我尝试执行docker pull / push命令时,我最终会使用 - no basic auth credentials
。
我偶然发现了这个link explaining my problem。但是,我无法使用此处建议的解决方案,因为主机中没有~/.docker/config.json
与Jenkins docker容器共享。
有什么建议?
Amazon ECR用户需要具有以下权限才能调用ecr:GetAuthorizationToken,然后才能对注册表进行身份验证,并从任何Amazon ECR存储库中推送或提取任何图像。 Amazon ECR提供多种托管策略来控制不同级别的用户访问;有关更多信息,请参阅ecr_managed_policies
AmazonEC2ContainerRegistryPowerUser
此托管策略允许高级用户访问Amazon ECR,该ECR允许对存储库进行读写访问,但不允许用户删除存储库或更改应用于它们的策略文档。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "*"
}]
}
因此,不要使用〜/ .docker / config.json,而是将上述策略角色分配给您的ECS任务,您的docker容器服务将能够从ECR推送拉图像。
IAM任务角色
使用Amazon ECS任务的IAM角色,您可以指定可由任务中的容器使用的IAM角色。应用程序必须使用AWS凭据签署其AWS API请求,此功能提供了管理应用程序使用的凭据的策略,类似于Amazon EC2实例配置文件为EC2实例提供凭据的方式。您可以将IAM角色与ECS任务定义或RunTask API操作相关联,而不是将AWS凭证创建和分发到容器或使用EC2实例的角色。然后,任务容器中的应用程序可以使用AWS SDK或CLI向授权的AWS服务发出API请求。
将IAM角色用于任务的好处
凭据隔离:容器只能检索在其所属的任务定义中定义的IAM角色的凭据;容器永远不能访问用于属于另一个任务的另一个容器的凭据。
授权:未经授权的容器无法访问为其他任务定义的IAM角色凭据。
可审计性:通过CloudTrail可以访问和事件记录,以确保追溯审计。任务凭证具有附加到会话的taskArn上下文,因此CloudTrail日志显示哪个任务正在使用哪个角色。
但是你必须像上面提到的那样运行这个命令才能获得Auth令牌。
eval $(aws ecr get-login --no-include-email)
你会得到回应
登录成功
现在,一旦从ECR获取auth令牌,就会推送拉图像。
docker push xxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/nodejs:test
以上是关于从jenkins docker ecs容器中访问ecr图像的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins:使用 docker compose 部署到 AWS ECS
使用 Jenkins 或 Job Scheduler 在 AWS ECS 上自动部署 Docker 容器
无法让 Docker 在 Docker 之外与 ECS 中的 Jenkins 一起工作