Gitlab Runner Docker: 无法解析主机

27

我在我的Ubuntu操作系统上使用了两个容器:Gitlab-ce和gitlab-runner。

这些容器的名称分别为:gitlab_gitlab_1gitlab_gitlab-runner_1

我通过gitlab.localhost.com:801访问我的Gitlab应用程序。

我成功地使用以下命令注册了一个runner:

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

接着,当我开始工作时,遇到了以下错误信息:

Running with gitlab-runner 10.7.1 (b9bba623)
  on 589a617ee407 12ba77f7
Using Docker executor with image alpine:latest ...
Pulling docker image alpine:latest ...
Using docker image sha256:3fd9065eaf02feaf94d68376da52541925650b81698c53c6824d92ff63f98353 for alpine:latest ...
Running on runner-12ba77f7-project-1-concurrent-0 via 01196621a827...
Cloning repository...
Cloning into '/builds/root/test'...
fatal: unable to access 'http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@gitlab.localhost.com/root/test.git/': Could not resolve host: gitlab.localhost.com
ERROR: Job failed: exit code 1

在这两个容器中,我都能够访问主机名gitlab.localhost.com。我认为问题出在alpine镜像上,它无法解析主机。

我该如何修复?

谢谢

Edit 1

docker-compose.yml

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.localhost.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.localhost.com'
    ports:
      - '801:80'
      - '443:443'
      - '22:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
    networks:
      - 'default'

  gitlab-runner:
    image: 'gitlab/gitlab-runner:latest'
    depends_on:
      - 'gitlab'
    restart: always
    volumes:
      - '/srv/gitlab-runner/config:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
      - 'default'
    links:
      - 'gitlab:gitlab.localhost.com'

networks:
  default:
    driver: 'bridge'

编辑 2

docker-compose.yml

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.localhost.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.localhost.com'
    ports:
      - '801:80'
      - '443:443'
      - '22:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
    networks:
      default:
        aliases:
          - 'gitlab.localhost.com'

  gitlab-runner:
    image: 'gitlab/gitlab-runner:latest'
    depends_on:
      - 'gitlab'
    restart: always
    volumes:
      - '/srv/gitlab-runner/config:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
      - 'default'

networks:
  default:
    driver: 'bridge'

你尝试过为这些容器创建一个Docker网络,以便它们可以相互连接吗? - Mostafa Hussein
是的,我也使用默认桥接驱动程序创建了一个用户定义网络,所以它们在同一个网络中。 - fliim
我已经将我的回复提交为答案。 - Mostafa Hussein
1
与 https://gitlab.com/gitlab-org/gitlab-runner/issues/1846 相关? - Tarun Lalwani
谢谢,我已经发布了修复我的问题的解决方案,感谢您提供的链接。 - fliim
显示剩余2条评论
10个回答

41

感谢Tarun Lalwan的链接和Joyce Babu的文章,根据他们的说法,在gitlab runner repos的[runners.docker] section中有一个未记录在案的选项

network_mode : Add container to a custom network

所以我必须在config.toml中设置我的网络名称选项,例如:

[[runners]]
  ...
  [runners.docker]
    ...
    network_mode = "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

非常感谢您!我已经试图解决这个问题两个小时了... - jantobola
9
谢谢!我还想补充一点,"gitlab_default"是特定于@fliim的docker-compose.yml文件的。请记住,网络名称是服务名称加上docker-compose.yml中指定的名称。例如,我的服务名称是 "infrastructure",网络名称是 "backend",因此该行中的network_mode为 network_mode = "infrastructure_backend" - bmauter
4
谢谢。你可以使用 docker network ls 命令列出你的网络。 - user6455909
上帝保佑你!它能工作了! - luchanos

28

我知道这个帖子很旧了,但是我看到到处都有指向这个帖子的线程,但对我没有解决。

我收到了相同的错误信息:

fatal: unable to access 'http://gitlab.maison.fr:82/angular/test1.git/': Could not resolve host: gitlab.maison.fr

config.toml 中添加 network_mode = "host" 可以解决这个问题。

以下是我在本地私有网络上的配置文件 config.toml

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "mars"
  url = "http://gitlab.maison.fr:82/"
  token = "TCfHAheTUdWMU2-fFNxK"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "gitlab/gitlab-runner:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    network_mode = "host"

解决了。太棒了。 - Martin

6

在不在docker compose中定义网络的情况下,以下翻译方式可用。只需在gitlab-runner配置文件中添加一个extra_hosts记录,就像我们在其他操作系统中添加A记录一样。

sudo vim /etc/gitlab-runner/config.toml

  [runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
extra_hosts = ["xxx.xxx.com.cn:192.168.10.110"]

official instruction for this args

https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdocker-section


1
谢谢!我花了好几天的时间来解决这个问题,而这是唯一有效的方法。可能是一个较新的问题,因为所有的答案似乎都是从 ~2017 年的。 - logan

3

如果对其他正在寻找此问题的人有所帮助,我很高兴。

遇到了相同的问题,但是GitLab和GitLab Runner在LAN中运行在不同的机器上。DNS正常工作,ping gitlab也可以正常工作,除了在docker内部:

复现问题:

$ sudo docker run -it alpine ping gitlab
ping: bad address 'gitlab'
^C

但是可以使用给定的DNS:

$ sudo docker run -it --dns=172.168.0.1 alpine ping gitlab
PING gitlab (172.168.0.5): 56 data bytes
64 bytes from 172.168.0.5: seq=0 ttl=63 time=0.536 ms
^C

为docker配置实际的局域网DNS

在GitLab Runner上编辑/etc/docker/daemon.json文件(如果该文件尚不存在),并填入以下内容:

{
    "dns": ["172.168.0.1", "1.1.1.1"]
}

再次测试,现在OK:

$ sudo docker run -it --dns=172.168.0.1 alpine ping gitlab
PING gitlab (172.168.0.5): 56 data bytes
64 bytes from 172.168.0.5: seq=0 ttl=63 time=0.455 ms
64 bytes from 172.168.0.5: seq=1 ttl=63 time=0.905 ms
^C

如果这不是应该的做法,我很乐意听取建议。 如果这个问题本来就不应该存在,我也很乐意听取建议。我惊讶地发现,在GitLab Runner中并没有找到太多关于这个问题的参考资料。

0

根据我的观察,您已经定义了一个网络,这意味着gitlabgitlab-runner都在同一个网络中。您可以使用docker inspect验证这一点。因此,您需要删除链接(links),因为您不再需要它。

为了设置网络别名,您需要将gitlab服务的网络部分更改为以下内容:

gitlab:
  ...
  networks:
    default:
      aliases:
        - gitlab.localhost.com

参考资料:


我按照你的建议更新了docker-compose.yml文件,运行了docker-compose downdocker-compose up -d。但是什么也没有改变。提醒一下,gitlab-runner容器可以访问gitlab.localhost.com,但作业却不能。我认为是由runner运行的alpine:latest容器内部无法访问此主机名。 - fliim
你可以验证gitlab容器是否有别名。你还可以登录到gitlab-runner容器中,并尝试在每个通过docker inspect找到的gitlab别名上运行ping、wget或curl命令。 - Mostafa Hussein
别名在 gitlab-runner 容器内有效,就像我之前说的那样。但是在从 gitlab 运行的作业中无效。 - fliim
你发布的错误信息看起来像是普通的 git clone $URL 错误,你能否在 Runner 容器中手动执行同样的命令? - Mostafa Hussein
git clone http://gitlab.localhost.com/root/test.git 可以在 Runner 容器中运行。 - fliim

0

对于任何试图在具有自己的 DNS 设置(即拥有自己的 DNS 服务器)的私有网络中使用 Docker 执行程序部署 Runner 的人,我尝试了上述解决方案,在 config.toml 中指定 Docker 网络,但它没有起作用。尽管我可以从主机和 Runner 容器中解析 gitlab.com,但我仍然收到上述错误。因此,作业容器无法解析 gitlab.com。最终对我有效的是:

[[runners]]
  ...
  [runners.docker]
    ...
    network_mode = "host"

0

最近我遇到了这个问题,尝试了各种不同线程中提出的解决方案后,我用以下方法解决了它:

pkill docker
iptables -t nat -F
ifconfig docker0 down
service docker restart

感谢我的Docker容器没有互联网


0

从网络角度来看,容器就像一个拥有自己IP地址、网络路由和DNS解析的独立服务器。唯一的例外是在主机网络上运行容器。

也就是说,您可能需要弄清楚主机机器的DNS解析方式(也许您已经将某些内容添加到了/etc/hosts中?),然后在容器内执行相同的操作。

或者使用这个例外,在主机网络上运行容器。


0
我也遇到了同样的问题,在我的情况下,服务器代理是开启状态,我只需要将其禁用。 #systemctl status firewalld #systemctl stop firewalld

0
我通过在config.toml中添加network_mode = "host"来解决了这个问题,它会使用/etc/resolve.conf中给定的网络配置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接