Docker部署下GitLab Runner访问同机GitLab实例克隆仓库的解决方法
解决方案:Docker部署GitLab与Runner的仓库克隆问题
1. 统一容器到自定义Docker网络
默认Docker网络存在隔离性,自定义网络可让容器通过服务名直接通信,避免DNS解析问题:
- 创建自定义网络:
docker network create gitlab-internal-net - 修改GitLab的
docker-compose.yml,加入网络配置:services: gitlab: # 原有镜像、端口、挂载等配置保留 networks: - gitlab-internal-net networks: gitlab-internal-net: external: true - 修改
/etc/gitlab-runner/config.toml,在[runners.docker]段添加网络配置:[runners.docker] # 原有配置保留 network_mode = "gitlab-internal-net" - 重启Runner生效:
gitlab-runner restart
2. 配置GitLab内部访问URL
GitLab会以external_url生成克隆地址,必须确保Runner容器能访问该地址:
- 在GitLab的
docker-compose.yml环境变量中设置内部URL:
这里services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://gitlab:80' # 其他原有Omnibus配置保留gitlab是GitLab容器的服务名,同一网络内Runner可直接通过该名称访问。 - 重启GitLab后,进入项目页面确认克隆地址为
http://gitlab:80/你的项目路径.git,若不一致,手动修改项目的默认克隆地址。
3. 强制Runner使用内部克隆地址
若GitLab自动生成的克隆地址是外部公网/本地IP,Runner容器可能无法访问:
- 进入GitLab项目的Settings > CI/CD > Runners,找到关联的Runner,修改其Clone URL为
http://gitlab:80(与GitLab内部URL一致)。
4. 验证容器连通性
先排查容器间基础网络是否正常:
- 进入Runner容器,测试能否ping通GitLab服务名:
docker exec -it <runner容器名> ping gitlab - 若ping通但克隆失败,测试HTTP访问:
若返回GitLab页面,说明网络正常,需排查权限问题:确认项目已开启该Runner的权限,或检查是否需配置SSH密钥(若用SSH克隆)。docker exec -it <runner容器名> curl http://gitlab:80
5. SSH克隆场景的密钥配置
若项目用SSH地址克隆,需确保Runner容器持有有效密钥:
- 在
config.toml中挂载本地SSH密钥目录到容器:[runners.docker] volumes = ["/本地密钥目录:/root/.ssh:ro"] - 本地密钥文件权限设为600,且公钥已添加到GitLab项目的部署密钥中。
内容的提问来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

