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

GitLab CI无法从自身容器仓库拉取镜像的问题求助

GitLab CI拉取私有容器镜像失败排查与解决

问题概述

GitLab CI拉取私有容器仓库镜像registry.gitlab.com/my-repo/infra/build-images/gcloud-node时提示权限拒绝,另一同配置项目可正常运行。已尝试添加部署令牌、docker login命令但无效,且before_script中的echo命令无输出。

错误日志

Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image registry.gitlab.com/my-repo/infra/build-images/gcloud-node ...
WARNING: Failed to pull image with policy "always": Error response from daemon: pull access denied for registry.gitlab.com/my-repo/infra/build-images/gcloud-node, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go:237:0s)
ERROR: Job failed: failed to pull image "registry.gitlab.com/my-repo/infra/build-images/gcloud-node" with specified policies [always]: Error response from daemon: pull access denied for registry.gitlab.com/my-repo/infra/build-images/gcloud-node, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go:237:0s)

当前配置与环境

GitLab CI配置(gitlab-ci.yml)

stages:
  - build
  - deploy

variables:
  TF_STATE_NAME: default
  TF_CACHE_KEY: default
  IMAGE_SUFFIX: $CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA
  GCP_IMAGE_TAG: gcr.io/$GCP_INFRA_PROJECT_ID/$CI_PROJECT_NAME:$IMAGE_SUFFIX
  GIT_SUBMODULE_STRATEGY: recursive

build:docker:
  stage: build
  image: registry.gitlab.com/my-repo/infra/build-images/gcloud-node
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://docker:2375
    GCR_SA_KEY:
  services:
    - docker:19.03.11-dind
  before_script:
    - echo "GITLAB_DEPLOY_TOKEN $CI_DEPLOY_USER $CI_DEPLOY_PASSWORD $CI_REGISTRY"
    - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
    - gcloud auth configure-docker --quiet us-docker.pkg.dev
    - cat $GOOGLE_APPLICATION_CREDENTIALS | docker login -u _json_key --password-stdin  https://gcr.io

项目结构

- 💼 my-project
  - 📁 infra
    - 📁 build-images
      - 📄 gcloud-node
      - 🛢️ Container Registry (from side menu)
        - 📸 gcloud-node
          - 4c353f7c
          - latest
  - 📁 sites
    - 📁 site
      - 📄 gcloud-node
- 🛢️ Container Registry (from side menu)
  - 📸 gcloud-node
    - 4c353f7c
    - latest

已尝试操作

  1. 在顶层和对应stage的before_script中添加docker login命令
  2. 在顶层组创建了全权限的gitlab-deploy-token部署令牌
  3. 本地使用相同URL登录成功(但Docker daemon未运行导致pull失败)

解决步骤

1. 修正镜像拉取时机问题

before_script是在拉取job指定的镜像之后才执行的,所以你在before_script里加的docker login根本没机会在拉取gcloud-node镜像前生效,这也是echo命令无输出的原因——job在拉取镜像阶段就失败了,根本没走到before_script环节。

2. 配置项目级/组级的镜像拉取凭据

方案A:项目级部署令牌

如果镜像存储在infra/build-images子项目中,需在当前运行CI的项目中配置访问该子项目镜像仓库的凭据:

  • 进入当前项目的设置 > 仓库 > 部署令牌,创建令牌并勾选read_registry权限
  • 将生成的用户名和令牌分别设置为项目CI/CD变量CI_DEPLOY_USER和CI_DEPLOY_PASSWORD

方案B:利用GitLab内置CI变量

如果当前项目和镜像所在项目同属一个顶层组,且组内开启了CI/CD变量共享,可直接使用GitLab自动注入的CI_REGISTRY_USER和CI_REGISTRY_PASSWORD(这也是另一个同配置项目无需手动部署令牌就能运行的原因):

  • 检查顶层组的设置 > CI/CD > 变量,确认CI_REGISTRY_USER和CI_REGISTRY_PASSWORD已配置并允许子项目继承
  • 或在当前项目的CI变量中直接引用这两个内置变量

3. 验证镜像路径正确性

确认镜像实际路径与CI中指定的一致:

  • 检查infra/build-images项目的容器仓库地址,是否确实为registry.gitlab.com/my-repo/infra/build-images/gcloud-node
  • 确保镜像标签latest或你指定的标签存在(当前项目结构中显示有latest和4c353f7c标签)

4. 测试凭据有效性

添加临时测试job验证凭据是否能正常拉取镜像:

test-pull-image:
  stage: build
  image: docker:latest
  services:
    - docker:19.03.11-dind
  variables:
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
    - docker pull registry.gitlab.com/my-repo/infra/build-images/gcloud-node:latest

若该job成功运行,说明凭据有效,问题出在原job的镜像拉取时机;若失败,说明凭据权限不足或路径错误。

5. 备选方案

  • 将镜像复制到当前项目的容器仓库中,直接使用当前项目的镜像地址
  • 使用GitLab镜像代理功能,将私有镜像代理到当前项目可访问的地址

内容的提问来源于stack exchange,提问作者1252748

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:53:12