【问题标题】:Why can't I connect to selenium docker-compose service from my GitLab job?为什么我无法从我的 GitLab 作业连接到 selenium docker-compose 服务?
【发布时间】:2021-12-23 03:44:46
【问题描述】:

我在 Gitlab CI 中运行 selenium 测试,但在使用 gitlab 运行器而不是我的计算机时正确设置远程 URL 时遇到问题。

跑步者的IP地址是192.168.xxx.xxx。当我运行管道时,我得到 selenium hub 的 IP 地址是172.19.0.2/16。我都试过了,都失败了。我也试过用selenium hub容器的名字http://selenium__hub,但是也失败了。

docker-compose.yml 是:

version: "3"
services:
  chrome:
    image: selenium/node-chrome:4.0.0-20211013
    container_name: chrome
    shm_size: 2gb
    depends_on:
      - selenium-hub
    volumes:
      - ./target:/home/seluser/Downloads
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6900:5900"
  edge:
    image: selenium/node-edge:4.0.0-20211013
    container_name: edge
    shm_size: 2gb
    depends_on:
      - selenium-hub
    volumes:
      - ./target:/home/seluser/Downloads
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6901:5900"
  firefox:
    image: selenium/node-firefox:4.0.0-20211013
    container_name: firefox
    shm_size: 2gb
    depends_on:
      - selenium-hub
    volumes:
      - ./target:/home/seluser/Downloads
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6902:5900"
  selenium-hub:
    image: selenium/hub:4.0.0-20211013
    container_name: selenium-hub
    ports:
      - "4444:4444"

gitlab runner 的配置文件如下所示:

[[runners]]
  name = "selenium"
  url = "https://gitlab.myhost.at"
  token = "xxxxxxxx"
  executor = "docker"
  privileged = true
  links = ["selenium__hub:hub"]
  [runners.docker]
    image = "docker:stable"
    privileged = true

我试过的远程网址是:

WebDriver driver = new RemoteWebDriver(new URL("http://192.168.xxx.xxx:4444/wd/hub"), cap);
WebDriver driver = new RemoteWebDriver(new URL("http://172.19.0.2:4444/wd/hub"), cap);
WebDriver driver = new RemoteWebDriver(new URL("http://selenium__hub:4444/wd/hub"), cap);

我怎样才能让它与 GitLab 跑步者一起工作?

【问题讨论】:

  • 可以编辑您的问题以包含您使用的 GitLab 作业配置和作业脚本吗?这样我们就可以知道你的工作是如何连接到 docker daemon/containers 的。还请准确描述“失败”的含义,您所看到的错误到底是什么。 -- 作为一个可能的注释,underscores are not RFC compliant in hostnames。这不应该是浏览器的问题,但以防万一,也许可以尝试为您的集线器服务使用不同的名称...但我怀疑问题是您的工作的网络设置。
  • 我已经编辑了您的问题标题和描述,以提高所问内容的清晰度。如果您觉得我在这方面有任何错误,请随时将其改回。
  • @sytech 很抱歉打扰您。你能看看另一个与 docker 和 gitlab CI 相关的话题吗?谢谢。 stackoverflow.com/questions/69974278/…

标签: docker selenium gitlab-ci gitlab-ci-runner selenium-rc


【解决方案1】:

这里的问题是,当您的作业使用 docker-compose 启动容器时,您的作业容器不知道 docker 网络中的主机名。

假设您在工作中使用docker:dind 服务来使用docker-compose,并且您正在尝试连接到从您的工作中以docker-cmpose 开始的服务,您需要使用主机名docker 才能访问您的服务通过它们的映射端口。

所以你更正的代码如下:

WebDriver driver = new RemoteWebDriver(new URL("http://docker:4444/wd/hub"), cap);

为什么是“码头工人”?

之所以需要这样做,是因为您的容器“在”远程 docker 守护程序服务——docker:dind 容器上运行。当您调用 docker-compose 时,您的作业容器会与 docker:dind 容器对话,后者会启动新的 docker 网络并在该网络上的 compose 文件中创建 docker 容器。

您的作业容器不知道(或路由到)该网络,也不知道服务的主机名。服务守护进程本身也运行在与运行器不同的网络上——因为它是另一个由 docker executor 创建的 docker 容器;所以你的跑步者 IP 也不起作用。

但是,docker 执行器确实会创建一个指向您的services: I.E. 的链接。 docker:dind 服务。所以你可以通过docker 主机名访问那个容器。此外,您的 compose 文件指示集线器服务应从主机 -> continaer 进行4444:4444 的端口映射。在这种情况下,主机是指docker:dind 服务。因此,从您的工作中调用 http://docker:4444 会到达中心服务。

为什么“链接”不起作用?

最后,要介绍最后一个细节,看起来在您的运行器配置中,您希望您的 links 允许您通过主机名与中心容器通信:

  links = ["selenium__hub:hub"]

在运行器配置中,links 配置确实允许您的作业通过主机名与容器通信。但是,此配置错误有两个原因:

  1. 此配置只能应用于容器您的运行器容器。那是在主机守护进程上注册的其他容器 - 不是由其他 docker 守护进程创建的容器,例如在您的工作中通过与docker:dind 服务守护进程对话使用docker-compose 创建的容器。
  2. 即使您可以访问由其他守护程序创建的容器,或者您的集线器容器是由主机守护程序创建的,根据您尝试的 URL,参数是错误的。这个配置基本上说“将selenium__hub 容器公开为FQDN hub”——但您从未尝试过主机名hub

这里没有什么需要修复,因为 (1) 在使用 docker-in-docker 时不是可修复的错误。

替代方案

或者,您可以利用 GitLab 的 services: 功能来运行集线器和/或浏览器容器。

my_job:
  services:
    - docker:dind
    - name: selenium/hub:4.0.0-20211013
      alias: hub  # this is the hostname

您甚至可以将其作为运行器配置进行,并为其赋予特殊标签,需要远程浏览器的作业只需添加必要的tags: 键即可减少所需的作业配置量。

您可能也有兴趣查看my other answers 之一,了解FF_NETWORK_PER_BUILD 功能标志如何影响 docker 容器和作业/服务之间的网络工作方式。

【讨论】:

  • 嗨,@sytech 非常感谢。您的建议“docker:4444/wd/hub”有效。这是我第一次看到这些如此清晰和有用的解释如何在管道中的 docker 中使用 docker。再次感谢你。 :)
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2011-10-11
相关资源
最近更新 更多