GitLab CI中无法将Jib生成的Docker镜像推送到ECR
解决GitLab CI中Jib推送镜像到ECR的401授权问题
问题背景
本地执行mvn clean install -DskipTests -Pdocker可正常构建并推送镜像到ECR(依赖amazon-ecr-credential-helper管理凭据),但GitLab CI环境中执行相同命令时触发401 Unauthorized错误,手动添加-Djib.to.auth.username/-Djib.to.auth.password参数也无效,需基于GitLab存储的凭据完成推送。
核心原因
ECR不支持直接用AWS访问密钥作为镜像推送的用户名/密码,必须使用临时授权Token(用户名固定为AWS)进行认证,这是你之前参数配置无效的关键原因。
解决方案
方案1:利用Jib内置的AWS凭据自动获取(推荐)
Jib插件原生支持AWS ECR的凭据自动发现,只需在GitLab CI中配置AWS环境变量即可:
- 在GitLab项目的Settings > CI/CD > Variables中添加以下变量(勾选「Mask variable」保护敏感信息):
AWS_ACCESS_KEY_ID:你的AWS访问密钥IDAWS_SECRET_ACCESS_KEY:你的AWS秘密访问密钥AWS_DEFAULT_REGION:ECR仓库所在区域(如eu-west-1)
- 更新
.gitlab-ci.yml配置,无需手动指定Jib认证参数:
Jib会自动读取环境变量中的AWS凭据,调用AWS SDK生成ECR临时授权Token,完成镜像推送。build backend: image: maven:3.8.6-amazoncorretto-17 stage: build tags: - runner-docker variables: AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION script: - cd backend - mvn clean install -DskipTests -Pdocker
方案2:手动生成ECR授权Token并传给Jib
若自动发现存在问题,可手动生成Token并传递给Jib:
- 同样在GitLab CI Variables中配置
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION - 修改CI脚本,安装AWS CLI并生成Token:
build backend: image: maven:3.8.6-amazoncorretto-17 stage: build tags: - runner-docker before_script: - apt-get update && apt-get install -y awscli variables: AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION script: - cd backend # 生成ECR授权Token - ECR_TOKEN=$(aws ecr get-login-password --region $AWS_DEFAULT_REGION) # 传递Token给Jib(用户名固定为AWS) - mvn clean install -DskipTests -Pdocker \ -Djib.to.auth.username=AWS \ -Djib.to.auth.password=$ECR_TOKEN
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

