为什么我无法从我的 GitLab 作业连接到 selenium docker-compose 服务?

Why can't I connect to selenium docker-compose service from my GitLab job?

我正在 Gitlab 运行ning selenium 测试 CI,但是当使用 gitlab 运行ner 而不是我的计算机时,无法正确设置远程 URL。

运行ner 的 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 运行ner 的配置文件如下所示:

[[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

我试过的遥控器url是:

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 运行ner 一起工作?

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

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

因此您更正后的代码如下:

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

为什么是“docker”?

需要这样做的原因是因为您的容器运行宁 'on' 远程 docker 守护进程服务 -- docker:dind 容器。当您调用 docker-compose 时,您的作业容器会与 docker:dind 容器对话,后者会启动一个新的 docker 网络,并在该网络上的撰写文件中创建 docker 容器。

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

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

为什么“links”不起作用?

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

  links = ["selenium__hub:hub"]

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

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

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

备选方案

或者,您可以利用 GitLab 的 services: 功能 运行 中心 and/or 浏览器容器。

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

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

您可能也有兴趣查看 中关于 FF_NETWORK_PER_BUILD 功能标志如何影响 docker 容器和 jobs/services 之间的网络工作方式的文章之一。