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

配置GitLab CI构建推送镜像至不安全仓库遇错误求助

搞定GitLab CI构建推送Docker镜像到不安全仓库的那些坑

嘿,看你在配置GitLab CI构建Docker镜像推送到不安全仓库时踩坑了,我帮你捋捋常见问题,再给你个能跑的配置方案~

先把你贴的原始配置整理出来(方便对比找问题):

stages:
  - build
  - deploy
variables:
  GIT_SUBMODULE_STRATEGY: recursive
  CONTAINER_IMAGE: XXX:$CI_COMMIT_REF_NAME
  # The insecure-registry flag
services:
  - docker:dind
build_container:
  image: docker:latest
  stage: build
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin

问题出在哪?

你提到是"不安全镜像仓库",核心问题基本都是Docker守护进程没配置允许访问不安全仓库,另外你的配置里还有几个关键遗漏:

  • 没给docker:dind服务加--insecure-registry参数,导致daemon拒绝和不安全仓库通信
  • 占位符XXX没替换成实际的仓库地址+镜像名,CI_REGISTRY如果不是你的不安全仓库地址,登录和推送都会出错
  • 部分Docker版本需要客户端也配置识别不安全仓库,否则推送时会报证书错误

修正后的完整配置(直接能用)

stages:
  - build
  - deploy

variables:
  GIT_SUBMODULE_STRATEGY: recursive
  # 替换成你的不安全仓库地址+镜像名,比如 my-insecure-registry:5000/my-project:$CI_COMMIT_REF_NAME
  CONTAINER_IMAGE: your-insecure-registry-url:port/your-image-name:$CI_COMMIT_REF_NAME
  # 单独定义不安全仓库地址,方便后续修改
  INSECURE_REGISTRY: "your-insecure-registry-url:port"

services:
  # 给docker:dind加上--insecure-registry参数,这是让daemon允许访问不安全仓库的关键
  - name: docker:dind
    command: ["--insecure-registry", "$INSECURE_REGISTRY"]

build_container:
  image: docker:latest
  stage: build
  before_script:
    # 如果你的不安全仓库需要认证,就保留这行;不需要的话直接注释掉
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$INSECURE_REGISTRY" --password-stdin
    # 给Docker客户端配置不安全仓库,避免某些版本推送时报错
    - mkdir -p ~/.docker
    - echo '{"insecure-registries": ["'"$INSECURE_REGISTRY"'"]}' > ~/.docker/config.json
  script:
    # 构建镜像(这里假设Dockerfile在项目根目录,不在的话加-f指定路径)
    - docker build -t $CONTAINER_IMAGE .
    # 推送到不安全仓库
    - docker push $CONTAINER_IMAGE

重点调整说明

  • docker:dind的command参数:必须加--insecure-registry,不然Docker守护进程会拒绝和非HTTPS/未认证的仓库交互,这是最核心的一步
  • 客户端配置:生成~/.docker/config.json是为了让Docker客户端也把这个仓库标记为不安全,避免推送时出现"x509 certificate signed by unknown authority"这类错误
  • 变量明确化:把不安全仓库地址单独拎出来当变量,以后改地址的时候不用到处找,更省心
  • 镜像名规范:替换掉占位符XXX,明确写出仓库地址+镜像名,避免推送时找不到目标仓库

如果还是报错,可以排查这几点:

  • 确认INSECURE_REGISTRY的地址和端口完全正确,别打错字
  • 检查GitLab项目的CI/CD变量里,CI_REGISTRY_USER和CI_REGISTRY_PASSWORD是不是已经正确设置(要是仓库不需要认证,直接跳过login步骤就行)
  • 看看Dockerfile有没有问题,比如构建时有没有找不到依赖文件的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:43