GitLab Runner Docker执行Job时无法解析gitlab.localhost.com主机求助
你的问题核心在于Runner的Docker executor启动的Alpine容器无法识别你本地自定义的域名gitlab.localhost.com——虽然GitLab和Runner容器本身能解析这个域名,但它们启动的子容器(Alpine)默认采用Docker主机的DNS配置,没有包含这个自定义域名的解析记录。下面给你几个可行的修复方案:
方案1:让Alpine容器加入GitLab专属网络(推荐)
Docker Compose默认会为项目创建一个专属网络,GitLab和Runner容器都在这个网络内,互相可以通过容器名直接访问。我们只需要让Runner启动的Alpine容器也加入这个网络,同时保持用GitLab容器名作为访问地址:
步骤1:重新注册Runner(或修改现有配置)
如果选择重新注册,执行以下命令(注意替换<项目网络名>,一般是你的docker-compose项目文件夹名_default,比如项目文件夹叫gitlab,那就是gitlab_default):
docker exec -it gitlab_gitlab-runner_1 gitlab-runner register --non-interactive --url http://gitlab_gitlab_1 --registration-token _wgMgEx3nBocYQtoi83c --executor docker --docker-image alpine:latest --docker-network-mode gitlab_default
如果不想重新注册,直接修改Runner配置文件:
- 进入Runner容器:
docker exec -it gitlab_gitlab-runner_1 /bin/bash
- 编辑
/etc/gitlab-runner/config.toml,找到对应Runner的配置块,确认并添加:- 确保
url = "http://gitlab_gitlab_1"(你注册时已设置) - 在
[[runners.docker]]小节下添加:network_mode = "gitlab_default"
- 确保
- 退出容器后重启Runner:
docker restart gitlab_gitlab-runner_1
这样Alpine容器会加入GitLab所在的专属网络,既能通过gitlab_gitlab_1容器名访问GitLab,也能在该网络内解析自定义域名(如果GitLab容器配置了对应hostname的话)。
方案2:给Alpine容器添加自定义域名映射
如果坚持要用gitlab.localhost.com这个域名,可以在Runner配置里直接映射该域名到GitLab容器的IP:
- 先获取GitLab容器的IP:
docker inspect gitlab_gitlab_1 | grep "IPAddress"
- 编辑Runner的
/etc/gitlab-runner/config.toml,在[[runners.docker]]部分添加:
[[runners.docker]] # 保留原有配置... extra_hosts = ["gitlab.localhost.com:<刚才获取的GitLab容器IP>"]
- 重启Runner容器即可生效。
方案3:修改Docker主机配置全局生效
你也可以在Docker主机的/etc/hosts里添加gitlab.localhost.com <GitLab容器IP>,然后修改Docker daemon配置文件/etc/docker/daemon.json,让所有容器继承主机的hosts解析:
{ "dns": ["8.8.8.8", "1.1.1.1"], "hosts": ["hosts"] }
最后重启Docker daemon:
systemctl restart docker
为什么之前的docker-compose修改没用?
你修改的是GitLab和Runner容器本身的配置,但Runner的Docker executor启动的Alpine容器是独立的子容器,默认不受docker-compose配置影响,必须通过Runner自身的配置来指定它的网络或DNS规则。
内容的提问来源于stack exchange,提问作者fliim

