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

DOCKER_AUTH_CONFIG配置正确但GitLab Runner无法拉取私有镜像

解决GitLab Runner拉取私有镜像被拒绝的问题

核心原因

你当前的CI环境中,实际执行docker compose up拉取镜像的是docker:dind服务容器,而非GitLab Runner宿主机或job运行的custom-python-image容器。你配置的DOCKER_AUTH_CONFIG默认只会注入到job容器的docker配置中,dind容器无法自动继承这个认证信息,导致拉取私有镜像时权限不足。

解决方案

方案1:给docker:dind服务传递认证变量

修改.gitlab-ci.yml中的services配置,将DOCKER_AUTH_CONFIG直接传递给dind容器:

services:
  - name: docker:dind
    alias: dockerhost
    variables:
      DOCKER_AUTH_CONFIG: $DOCKER_AUTH_CONFIG

docker:dind容器启动时会自动读取这个环境变量,生成对应的~/.docker/config.json认证文件,从而获得拉取私有镜像的权限。

方案2:在job脚本中手动配置认证(推荐用GitLab内置令牌)

不需要依赖预配置的DOCKER_AUTH_CONFIG,直接用GitLab自动生成的CI_JOB_TOKEN完成登录,更安全且无需维护base64凭证:

script:
  - python3 --version
  - docker compose version
  # 用CI_JOB_TOKEN登录私有仓库
  - echo "$CI_JOB_TOKEN" | docker login registry.gitlab.com -u gitlab-ci-token --password-stdin
  - cd project
  - docker compose up -d

CI_JOB_TOKEN是GitLab为每个CI任务自动生成的临时令牌,拥有当前项目私有镜像仓库的拉取权限,无需额外配置。

额外优化建议

  1. 简化custom-python-image镜像
    你的自定义镜像基于docker:20.10-dind是冗余的,因为已经使用了docker:dind服务提供docker daemon。建议改为基于python镜像安装docker客户端即可:
FROM python:3.8-alpine

RUN apk update && apk add --no-cache \
        docker-cli \
        docker-compose \
        chromium \
        chromium-chromedriver

CMD ["sh"]

这样镜像更轻量,避免不必要的权限冲突。

  1. 检查Runner配置的pull_policy
    你的runner配置中pull_policy = ["never"],需确保custom-python-image已经存在于Runner宿主机上,否则会导致job启动失败。如果需要更新镜像,可改为pull_policy = ["if-not-present"]。

  2. 验证DOCKER_AUTH_CONFIG变量格式
    如果坚持使用预配置的DOCKER_AUTH_CONFIG,需确保在GitLab项目变量中配置时,整个JSON内容用单引号包裹,避免引号转义问题,例如:

'{
    "auths": {
        "registry.gitlab.com": {
            "auth": "MY_BASE64_CREDENTIALS"
        }
    }
}'

内容的提问来源于stack exchange,提问作者cookie-LGO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:32:40