如何在Gitlab CI中登录AWS ECR以拉取Docker镜像?
解决方案
错误原因
报错是因为Gitlab CI的Docker执行器拉取作业运行基础镜像的动作,发生在作业脚本(包括before_script)执行之前,直接在脚本里执行docker login不会作用于镜像拉取阶段,必须通过Gitlab的内置凭证配置实现预登录。
方案1:配置DOCKER_AUTH_CONFIG变量(推荐)
这是Gitlab官方提供的私有镜像拉取验证方案,操作步骤如下:
- 在本地安装AWS CLI并配置拥有ECR拉取权限的AK/SK,执行命令生成登录凭证:
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 301768173512.dkr.ecr.eu-west-1.amazonaws.com - 打开本地Docker配置文件
~/.docker/config.json,复制全部内容 - 进入Gitlab项目后台,依次打开「设置」->「CI/CD」->「变量」,新增变量:
- 变量名填
DOCKER_AUTH_CONFIG - 变量值粘贴刚才复制的config.json内容
- 勾选受保护、掩码两个选项,避免凭证泄露
- 变量名填
- 保存后重新运行流水线即可正常拉取镜像
注意:AWS ECR的登录凭证默认有效期为12小时,长期使用可以配合定时脚本自动刷新变量值:通过AWS API定时生成新的凭证,调用Gitlab OpenAPI自动更新DOCKER_AUTH_CONFIG变量即可,无需手动操作。
方案2:作业内拉取运行镜像(临时使用)
如果不想处理凭证刷新问题,也可以将自定义镜像的拉取和运行逻辑放到作业脚本内,作业基础镜像改用公共的Docker镜像:
your-build-job: image: docker:latest services: - docker:dind variables: AWS_ACCESS_KEY_ID: $AWS_AK AWS_SECRET_ACCESS_KEY: $AWS_SK AWS_DEFAULT_REGION: eu-west-1 before_script: # 安装AWS CLI - apk add --no-cache aws-cli # 登录ECR - aws ecr get-login-password | docker login --username AWS --password-stdin 301768173512.dkr.ecr.eu-west-1.amazonaws.com # 拉取自定义镜像 - docker pull 301768173512.dkr.ecr.eu-west-1.amazonaws.com/inuka-ci:latest script: # 运行自定义镜像执行构建命令 - docker run --rm -v $(pwd):/workspace 301768173512.dkr.ecr.eu-west-1.amazonaws.com/inuka-ci:latest mvn clean package
权限注意事项
给用于生成ECR凭证的IAM账号只授予最小必要权限即可,示例IAM策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": "*" } ] }
内容的提问来源于stack exchange,提问作者Halil
相关产品推荐
相关产品推荐

