已安装在EC2的Amazon ECR credential helper能否在Docker容器内使用
报错原因
你收到的no basic auth credentials报错是因为GitLab Runner的Docker执行器拉取私有ECR镜像的动作发生在job容器启动之前,和job容器内部的环境无关。你之前的配置是在job容器内手动执行docker login再拉镜像,而新配置是让Runner直接拉取镜像作为job的运行环境,所以需要给Runner本身配置ECR访问权限,完全不需要在业务镜像中安装任何凭证工具。
可行方案(无需修改业务镜像)
方案1:挂载宿主机凭证配置到Runner容器
你的GitLab Runner本身运行在Docker容器中,只需要在启动Runner容器时挂载两个路径即可复用宿主机已安装的ECR凭证助手能力:
- 把宿主机的ECR凭证助手二进制
/usr/local/bin/docker-credential-ecr-login挂载到Runner容器的同路径 - 把宿主机的Docker配置文件
~/.docker/config.json(已配置credsStore: "ecr-login")挂载到Runner容器的/root/.docker/config.json路径
配置完成后重启Runner容器即可,后续Runner拉取ECR镜像时会自动调用凭证助手完成认证。
方案2:配置GitLab DOCKER_AUTH_CONFIG全局变量
如果你不想修改Runner的启动配置,可以直接在项目的CI/CD变量中添加名为DOCKER_AUTH_CONFIG的变量,值为如下格式的JSON:
{ "auths": { "<你的ECR仓库地址>": { "auth": "<AWS:ECR登录凭证的Base64编码值>" } } }
凭证可以通过命令 aws ecr get-login-password | awk '{print "AWS:"$0}' | base64 -w 0 生成,有效期为12小时,你可以在EC2上配置定时任务每10小时自动更新该变量即可。
方案3:绑定IAM角色(长期稳定方案)
首先给运行GitLab Runner的EC2实例附加包含ecr:GetAuthorizationToken、ecr:BatchGetImage、ecr:GetDownloadUrlForLayer权限的IAM策略,再按照方案1的方式挂载凭证助手和Docker配置文件,最后修改Runner的/etc/gitlab-runner/config.toml配置:
[[runners]] environment = ["DOCKER_CONFIG=/root/.docker"] [runners.docker] pull_policy = ["if-not-present"]
配置完成后无需手动更新凭证,Runner会自动通过EC2的IAM角色获取ECR访问权限。
以上三种方案配置完成后,你期望的第二种CI配置即可正常运行。
内容的提问来源于stack exchange,提问作者Alessandro

