GitLab Runner(Docker-Machine执行器)拉取镜像时无基础认证凭证报错
解决GitLab Runner(Docker-Machine+DinD)构建镜像时ECR认证失败问题
你遇到的问题是Docker-in-Docker(DinD)模式下的典型认证同步问题:虽然在Runner主机上执行ECR登录显示成功,但构建过程是在DinD容器内的Docker daemon中运行,主机的Docker认证信息不会自动传递到容器里,导致拉取基础镜像时提示无认证凭证。下面是几个可行的解决方法:
在DinD上下文内重新执行ECR登录:
不要在Runner主机层面执行登录,而是把登录命令放到构建步骤中,确保在DinD容器内执行。修改流水线脚本,将登录命令改为:aws ecr get-login --no-include-email --region "${REGION}" | sh这样认证信息会直接写入DinD容器内的Docker配置文件,构建时就能正常读取。
修复Docker配置文件权限:
如果Runner配置中已经挂载了主机的/root/.docker目录到DinD容器,需确保登录后的config.json权限正确,执行:chmod 600 /root/.docker/config.json权限过宽会导致Docker拒绝读取认证信息。
确保使用最新ECR凭证:
ECR临时凭证有效期仅12小时,即使看到登录成功,也可能在构建时已过期。建议将登录命令放在docker build步骤的紧前面,保证使用最新的有效凭证。验证Runner实例的IAM权限:
确认Runner所在EC2实例的IAM角色,是否包含ecr:GetAuthorizationToken、ecr:BatchGetImage、ecr:GetDownloadUrlForLayer这些必要权限,权限变更可能导致认证后仍无法拉取镜像。
附上你的执行日志:
$(aws ecr get-login --no-include-email --region "${REGION}") WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded $ IMAGE_TAG="$CI_COMMIT_SHORT_SHA" $ echo "Building image..." Building image... $ docker build -t $REPOSITORY_URL/"$xxxxxx":latest . -f Dockerfile Step 1/11 : FROM xxxxxxxx.dkr.ecr.eu-central-1.amazonaws.com/xxxxxxx Head "https://xxxxxxxx.dkr.ecr.eu-central-1.amazonaws.com/v2/xxxxxxx/manifests/latest": no basic auth credentials Cleaning up file based variables 00:01 ERROR: Job failed: exit code 1
内容的提问来源于stack exchange,提问作者Lado Golijashvili
相关产品推荐
相关产品推荐

