You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:15:03