DOCKER_AUTH_CONFIG配置正确但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任务自动生成的临时令牌,拥有当前项目私有镜像仓库的拉取权限,无需额外配置。
额外优化建议
- 简化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"]
这样镜像更轻量,避免不必要的权限冲突。
检查Runner配置的pull_policy
你的runner配置中pull_policy = ["never"],需确保custom-python-image已经存在于Runner宿主机上,否则会导致job启动失败。如果需要更新镜像,可改为pull_policy = ["if-not-present"]。验证DOCKER_AUTH_CONFIG变量格式
如果坚持使用预配置的DOCKER_AUTH_CONFIG,需确保在GitLab项目变量中配置时,整个JSON内容用单引号包裹,避免引号转义问题,例如:
'{ "auths": { "registry.gitlab.com": { "auth": "MY_BASE64_CREDENTIALS" } } }'
内容的提问来源于stack exchange,提问作者cookie-LGO

