Docker部署GitLab生成带容器ID的错误URL 无法访问克隆仓库
CentOS7服务器上通过Docker+Portainer部署自建GitLab,创建用户后基础功能可正常访问,但点击用户主页时报错,异常页面如下:
排查发现系统自动生成的用户主页地址为http://0de09c2e3bc1/Parisa_hr,其中0de09c2e3bc1为异常随机字段。
仓库克隆地址存在相同问题:
- SSH克隆地址:
git@0de09c2e3bc1:groupname/projectname.git - HTTP克隆地址:
http://0de09c2e3bc1/groupname/projectname.git
执行克隆时抛出错误:
ssh: Could not resolve hostname 0de09c2e3bc1: Temporary failure in name resolution fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
经确认0de09c2e3bc1是Docker自动生成的GitLab容器主机名(进入容器控制台可见提示符为root@0de09c2e3bc1:/#),手动修改GitLab配置项external_url为服务器https://IP:port格式地址后问题未解决。
地址中出现容器ID的核心原因是GitLab未正确读取到对外服务的访问地址配置,回退使用了容器自身的hostname作为访问域名。单纯修改external_url不生效,通常是配置修改后未执行重载、参数配置错误,或容器启动时未做固定主机名、持久化配置导致的。
1. 修正GitLab核心配置
找到GitLab的主配置文件gitlab.rb,如果是容器部署,优先修改你挂载到宿主机的配置文件,避免容器重建后配置丢失;如果未做挂载,可以先进入容器编辑/etc/gitlab/gitlab.rb,确保以下参数配置正确,替换为你实际的服务器IP和端口:
# 配置对外HTTP/HTTPS访问地址,协议、IP、端口必须和你实际访问的地址完全一致 external_url 'http://你的服务器IP:映射的HTTP访问端口' # 单独配置SSH克隆地址的主机和端口,避免自动读取容器hostname gitlab_rails['gitlab_ssh_host'] = '你的服务器IP' gitlab_rails['gitlab_shell_ssh_port'] = 映射的SSH访问端口
注意:如果你的SSH端口不是默认22,必须显式配置gitlab_shell_ssh_port参数,否则生成的SSH克隆地址不会带端口,会导致克隆失败
2. 重载配置让参数生效
修改完配置文件后,进入GitLab容器控制台执行以下命令重载配置,不要直接重启容器:
# 重新编译应用GitLab配置,执行过程需要3-10分钟,不要中断 gitlab-ctl reconfigure # 配置重载完成后重启所有GitLab服务 gitlab-ctl restart
3. 修正Portainer中容器的启动配置(避免重启后失效)
回到Portainer的容器管理页面,找到GitLab容器进入编辑模式,调整以下配置:
- 在高级容器设置的「主机名」选项中,直接填写你的服务器IP或绑定的域名,禁止留空——留空时Docker会自动生成12位容器ID作为主机名,会被GitLab读取为默认访问地址
- 核对端口映射规则,必须和你
gitlab.rb中配置的端口完全对应:- 容器内部80端口,映射到你
external_url中填写的HTTP端口 - 容器内部22端口,映射到你
gitlab_shell_ssh_port中填写的SSH端口 - 如果启用HTTPS,容器内部443端口映射到你配置的HTTPS端口
- 容器内部80端口,映射到你
- 确认GitLab的配置、数据、日志目录都做了宿主机持久化挂载,避免容器重建时配置被重置
调整完成后保存配置,重启GitLab容器。
4. 验证修复效果
容器重启后等待5分钟左右,待所有GitLab服务进程完全启动后,清除浏览器缓存重新登录:
- 点击用户主页,确认地址栏显示为你配置的服务器IP/域名,不再出现容器ID
- 打开任意仓库页面,查看HTTP/SSH克隆地址,确认地址中的IP、端口配置正确,执行克隆操作验证功能正常
- 不要只在容器控制台内修改配置,如果没有做配置文件持久化挂载,容器重建后所有修改都会丢失
external_url末尾不要加多余的斜杠,端口必须和Docker映射的宿主机端口保持一致,否则会出现跳转异常- 如果重载配置后页面仍显示旧地址,优先清除浏览器缓存、或者换无痕模式访问,GitLab前端有较强的静态资源缓存
内容的提问来源于stack exchange,提问作者Parisa.H.R

