GitLab共享Runner中ECR登录失败,ECS部署受阻
问题场景
通过任务定义部署ECS,使用ECR存储Docker镜像,在GitLab CI/CD共享Runner中执行ECR登录时失败。
当前CI/CD配置
image: docker:19.03.11 services: - docker:dind variables: REPOSITORY_URL: <REPOSITORY_URL> TASK_DEFINITION_NAME: <Task_Definition> CLUSTER_NAME: <CLUSTER_NAME> SERVICE_NAME: <SERVICE_NAME> before_script: - apk add --no-cache curl jq python py-pip - pip install awscli - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY - aws configure set region $AWS_DEFAULT_REGION - $(aws ecr get-login --no-include-email --region "${AWS_DEFAULT_REGION}") - IMAGE_TAG="$(echo $CI_COMMIT_SHA | head -c 8)" stages: - build - deploy build: stage: build script: - echo "Building image..." - docker build -t $REPOSITORY_URL:latest . - echo "Tagging image..." - docker tag $REPOSITORY_URL:latest $REPOSITORY_URL:$IMAGE_TAG - echo "Pushing image..." - docker push $REPOSITORY_URL:latest - docker push $REPOSITORY_URL:$IMAGE_TAG
错误详情
Docker daemon返回认证错误:
Error response from daemon: Get https://
.dkr.ecr. .amazonaws.com/v2/: no basic auth credentials
说明Docker未获取到ECR仓库的基础认证凭据,导致登录失败。
解决办法
替换ECR登录命令:弃用旧版
aws ecr get-login命令,改用更可靠的密码传递方式,将before_script中的登录行替换为:aws ecr get-login-password --region "${AWS_DEFAULT_REGION}" | docker login --username AWS --password-stdin "${REPOSITORY_URL%/*}"该命令直接将ECR登录密码传递给Docker,避免shell解析或环境变量导致的凭据丢失问题。
验证AWS变量配置:检查GitLab项目CI/CD变量中
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION是否正确设置,若分支为非保护分支,确保变量未标记为Protected;同时确认IAM用户拥有ecr:GetAuthorizationToken及镜像推送相关权限。升级AWS CLI:原配置安装的是默认版本AWS CLI,建议升级到最新版,替换
pip install awscli为:pip install --upgrade awscli旧版CLI存在ECR认证兼容性问题,升级后可解决多数相关故障。
检查Docker服务状态:在登录命令前添加
docker info,确认docker:dind服务已正常启动,避免因Docker daemon未就绪导致的登录失败。
内容的提问来源于stack exchange,提问作者R.Vijayakumar

