我正在尝试设置amazon-ecr-credential-helper,
但no basic auth credentials
在我尝试时总是得到docker pull
。
当我使用aws ecr get-login
和docker login ...
那我也没问题。
我按照他们的 README 文件中的说明使用 docker 映像创建了二进制文件。
在故障排除部分,他们说应该存储一个日志文件,~/.ecr/log
但该/.ecr
文件夹不存在。
规格:Docker 版本 18.06.1-ce,构建 e68fc7a
aws-cli/1.16.31 Python/2.7.15 Darwin/17.4.0 botocore/1.12.21
MacOS 高山脉
我希望有人有一个想法来弄清楚出了什么问题。
python3 以及https://docker-py.readthedocs.io/en/stable/
我只是好奇,当我登录到 ecr(通过 aws ecr get-login)时,我 PC 上的 docker deamon 会记住令牌,即使重新启动 shell,我也可以登录到 ECR,直到令牌过期。我什至可以在 auths 密钥的 ~/.docker/config.json 文件中看到
令人惊讶的是,通过 python docker SDK 登录:
ecr_client = boto3.client('ecr')
token = ecr_client.get_authorization_token()
username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode().split(':')
registry = token['authorizationData'][0]['proxyEndpoint']
docker_client.login(
username=username,
password=password,
registry=registry
)
client.pull(...)
Run Code Online (Sandbox Code Playgroud)
让我的 docker 守护进程对登录尝试一无所知。当我尝试通过命令行提取相同的图像时 - 我收到错误“无身份验证凭据”。更奇怪的是,当我通过命令行登录 ECR 时,我不再需要通过 python 脚本进行身份验证。
知道为什么会这样吗?
给出以下命令时出现以下错误。
aws ecr get-login --region eu-central-1
Run Code Online (Sandbox Code Playgroud)
错误
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::314xxxx91079:user/git is not authorized to perform: ecr:GetAuthorizationToken on resource: *
Run Code Online (Sandbox Code Playgroud)
我的管理员已授予我访问此“GetAuthorizationToken”资源的权限。
很可能我认为问题是用于此命令的 'arn:aws:iam::314xxxx91079:user/git' 用户。当我登录到 aws 控制台时,我看到我的用户名 (IAM) 如下。
amit@iproxxx.com
Run Code Online (Sandbox Code Playgroud)
我如何让 'get-login' 使用这个用户名而不是 user/git。我对 aws cli 很陌生,这个命令恰好是构建步骤之一。
当我尝试使用 AWS CodeBuild 从 ECR 中提取映像作为 Docker Build 的一部分时遇到凭据问题。
对于上下文,我们的设置是这样的:
Codebuild 正在调用我们编写的内部 docker 工具。这个工具然后正在做 docker 构建。可以使这更容易理解的示例命令:
../codebuild-templates/ourtoolscript docker -v
Run Code Online (Sandbox Code Playgroud)
“ourtoolscript”只是一个设置一堆环境变量的bash脚本,最后用我们指定的命令调用docker run。
问题
我们正在尝试在此工具中进行 docker 构建。它可以在本地工作,也可以与其他不从 ECR 拉取映像进行构建的存储库一起使用。
我们正在这样做,因此所有标记逻辑和所有内容都是工具中的一个脚本,我们可以将其应用于每个存储库。所以说只在工具之外做一个 docker build 是不可接受的解决方案。
如果 docker 文件从 ECR 中提取“FROM”,它将失败:
time="2019-03-12T14:48:25Z" level=error msg="Error listing credentials" error="ecr: Failed to get authorization token: MissingRegion: could not find region configuration"
Get https://URLTOECRWITHTAG: no basic auth credentials
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情:
我所知道的:
这里的情况是我们有一个应用程序,该应用程序当前正在 Jenkins slave 上构建,并在其上安装了特定版本的节点。我们想要标准化构建环境,因此想要在 docker 容器中构建。
通过我的研究,这绝对是可能的。然而,我们面临的挑战是我们想要使用我们自己管理并存储在 ECR 中的自定义图像。我们不想使用 docker hub 上的那些。考虑到这一限制,我正在努力在我的 Jenkinsfile 中对我们的 ECR 进行身份验证。理想情况下,我可以做这样的事情:
pipeline {
agent {
docker {
image 'node:7'
registryUrl 'ecr_url.amazonaws.com'
registryCredentialsId 'ecr:us-east-1:iam_role'
}
}
stages {
stage('Build') {
steps {
sh 'command goes here'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这里的问题是,我们的 ECR 登录依赖于在 Jenkins 工作器(安装了 aws cli)上运行 shell 命令来登录并访问图像。到目前为止,我还没有在 Jenkinsfile 中进行身份验证,所以我可以提取一个图像来运行构建。有谁知道这是否可能,如果是,如何编辑 Jenkinsfile 来做到这一点?
我正在使用 Fargate 启动 ECS 任务,容器在处于 PENDING 状态几分钟后最终处于 STOPPED 状态。状态提供以下错误消息:
CannotPullContainerError: context canceled
Run Code Online (Sandbox Code Playgroud)
我正在使用 PrivateLink 来允许 ECS 主机与 ECR 注册表对话,而无需通过公共互联网,这就是它的配置方式(无服务器语法增强 CloudFormation):
Properties:
PrivateDnsEnabled: true
ServiceName: com.amazonaws.ap-southeast-2.ecr.dkr
SubnetIds:
- { Ref: frontendSubnet1 }
- { Ref: frontendSubnet2 }
VpcEndpointType: Interface
VpcId: { Ref: frontendVpc }
Run Code Online (Sandbox Code Playgroud)
关于导致错误的原因有什么想法吗?
我正在使用 AWS ECR 来托管私有 Dockerfile 映像,我想在 GitLab CI 中使用它。
根据文档,我需要设置 docker-credential-ecr-login 以获取私有图像,但我不知道如何在其他任何事情之前做到这一点。那是我的 .gitlab-ci 文件:
image: 0222822883.dkr.ecr.us-east-1.amazonaws.com/api-build:latest
tests:
stage: test
before_script:
- echo "before_script"
- apt install amazon-ecr-credential-helper
- apk add --no-cache curl jq python py-pip
- pip install awscli
script:
- echo "script"
- bundle install
- bundle exec rspec
allow_failure: true # for now as we do not have tests
Run Code Online (Sandbox Code Playgroud)
谢谢你。
我有2个AWS账户:-具有ECR回购的账户A。-具有运行Fargate的ECS群集的帐户b。
我在具有对账户B的信任关系的账户A中创建了“跨账户”角色,并且我已经将“ AmazonEC2ContainerRegistryPowerUser”策略附加到了该角色。
通过在存储库策略中添加帐户B的ID和“跨帐户”角色,可以访问帐户A中的ECR存储库。
我将策略附加到Fargate的“ TaskExecutionRole”上,使Fargate可以承担“跨帐户”角色。
当尝试通过引用帐户A中的图像在帐户B中部署Fargate任务时,出现500错误。
我有预置的 Jenkins 服务器。我有创建 Docker 镜像的 Jenkins 文件,现在我想将该镜像推送到 AWS ECR。我是否必须创建一个特殊的 IAM 用户并提供其访问和秘密访问密钥?或者什么是最好的方法来做到这一点。
我在互联网上找到了下面
withAWS(role:'Jenkins', roleAccount:'XXXX216610',duration: 900, roleSessionName: 'jenkinssession')
sh ' eval \$(aws ecr get-login --no-include-email --region us-east-2) '
Run Code Online (Sandbox Code Playgroud)
但是由于我的 jenkins 服务器是本地部署,角色将如何工作?
我正在尝试将 ECR 和 Elastic Beanstalk 与以下 CodePipeline 设置结合起来:
buildspec.yml
它构建一个 docker 镜像并将其推送到 ECR 存储库请注意,第 2 步不包含任何工件,它仅通过使用从源代码构建新映像docker build -t <my-image> .
并将其推送到带有最新标记的 ECR。
我的问题是:
Dockerrun.aws.json
每次都指向ECR图像文件的工件是否相同?amazon-web-services amazon-elastic-beanstalk aws-codepipeline aws-ecr
aws-ecr ×10
docker ×6
jenkins ×2
amazon-ecs ×1
aws-cli ×1
aws-lambda ×1
dockerfile ×1
gitlab ×1
python ×1