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

Docker构建镜像代理失效排查(GitLab CI+Gradle环境)

问题分析与服务器层面解决方案

我来帮你拆解下问题所在——你之前配置的几个代理没生效,核心原因是没搞清楚GitLab Runner服务、Docker daemon、容器内部进程这三个层面的代理作用范围差异。你的诉求(不在代码/CI配置里硬编码代理)非常合理,完全可以通过服务器层面的配置解决。

为什么之前的配置没生效?

  • /etc/environment:这个文件是给交互式登录shell加载环境变量用的,但GitLab Runner是以systemd服务的形式后台运行的,不会读取这个文件的内容,所以代理变量根本没传到Runner进程里。
  • ~/.docker/config.json:首先你大概率修改的是当前登录用户(比如root)的配置,但GitLab Runner默认是用gitlab-runner系统用户运行的,这个配置文件对它无效;其次,这个配置只控制Docker客户端拉取镜像时的代理,和容器内部Gradle下载依赖的请求无关。
  • /etc/systemd/system/docker.service.d/http-proxy.conf:这个是给Docker daemon本身配置的代理,仅用于Docker daemon拉取基础镜像(比如你Dockerfile里的FROM ubuntu:18.04),同样不影响容器内部运行的Gradle进程的网络请求。

正确的服务器层面解决方案

根据你用Docker executor构建镜像的场景,推荐两种服务器层面的配置方式,任选其一即可:

方案1:让GitLab Runner传递代理变量到所有CI Job容器

这种方式更灵活,可以精准控制哪些变量传递给CI容器,且只影响GitLab Runner的Job,不干扰服务器上的其他Docker使用。

  1. 给GitLab Runner服务添加代理环境变量
    编辑Runner的systemd服务配置:

    sudo systemctl edit gitlab-runner
    

    在打开的编辑器中添加以下内容(替换成你的代理地址和无需代理的内部域名):

    [Service]
    Environment="HTTP_PROXY=http://your-proxy-ip:port/"
    Environment="HTTPS_PROXY=http://your-proxy-ip:port/"
    Environment="NO_PROXY=localhost,127.0.0.1,your-internal-maven-repo.com"
    

    保存后重载systemd并重启Runner:

    sudo systemctl daemon-reload
    sudo systemctl restart gitlab-runner
    
  2. 配置Runner将代理变量传递给Job容器
    编辑Runner的主配置文件(通常路径是/etc/gitlab-runner/config.toml),找到对应的[[runners]]段落,添加environment字段:

    [[runners]]
      # 保留原有的其他配置(比如url、token、executor等)
      executor = "docker"
      environment = ["HTTP_PROXY=http://your-proxy-ip:port/", "HTTPS_PROXY=http://your-proxy-ip:port/", "NO_PROXY=localhost,127.0.0.1,your-internal-maven-repo.com"]
    

    重启Runner使配置生效:

    sudo gitlab-runner restart
    

方案2:全局配置Docker容器默认使用代理

如果你的服务器上所有Docker容器都需要使用代理,可以直接配置Docker daemon让所有新创建的容器自动继承代理环境变量:

  1. 编辑Docker daemon配置文件(如果不存在就新建):
    sudo nano /etc/docker/daemon.json
    
    添加以下内容:
    {
      "proxies": {
        "default": {
          "httpProxy": "http://your-proxy-ip:port/",
          "httpsProxy": "http://your-proxy-ip:port/",
          "noProxy": "localhost,127.0.0.1,your-internal-maven-repo.com"
        }
      }
    }
    
  2. 重启Docker daemon:
    sudo systemctl restart docker
    
    注意:这个配置会影响服务器上所有新创建的Docker容器,包括非CI相关的容器。

验证配置是否生效

你可以在gitlab-ci.yml里临时加一个测试步骤,验证容器内是否能拿到代理变量:

test-proxy:
  stage: test
  script:
    - echo "HTTP_PROXY: $HTTP_PROXY"
    - curl -I https://your-maven-repo.com/repository/maven-public/

如果能打印出正确的代理地址,且curl能成功访问Maven仓库,说明配置生效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:54:04