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使用。
给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配置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让所有新创建的容器自动继承代理环境变量:
- 编辑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" } } } - 重启Docker daemon:
注意:这个配置会影响服务器上所有新创建的Docker容器,包括非CI相关的容器。sudo systemctl restart docker
验证配置是否生效
你可以在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
相关产品推荐
相关产品推荐

