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

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

我正在 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 运行程序的配置文件如下所示:

[[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 runner 一起使用?

最佳答案

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

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

所以您更正后的代码如下:

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

为什么是“docker”?

之所以需要这样做,是因为您的容器正在远程 docker 守护进程服务(docker:dind 容器)上运行。当您调用 docker-compose 时,您的作业容器会与 docker:dind 容器通信,后者会启动一个新的 docker 网络,并在该网络上的 compose 文件中创建 docker 容器。网络。

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

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

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

最后,为了介绍最后一个细节,在您的运行程序配置中,您似乎希望您的链接允许您通过主机名与集线器容器进行通信:

  links = ["selenium__hub:hub"]

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

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

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

替代方案

或者,您可以利用 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 容器和作业/服务之间的网络工作方式。

关于docker - 为什么我无法从我的 GitLab 作业连接到 selenium docker-compose 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69915035/

相关文章:

docker - 在 docker-compose.yaml 中设置 security_opt 不起作用

python - 使用 Docker 测试 Mongo

java - 这个简单的 Java/Selenium WebDriver 代码是如何工作的

linux - 如何在 gitlab ci :bad substitution 中修复 bash

gitlab-ci - 推送构建图像时,Gitlab-runner 有 'access denied'

java - 使用 Dockerfile 将 excel (.xls) 文件复制到容器

docker - 如何减小 Docker 镜像的大小

java - 显式等待无法正常工作,即使加载了元素,仍然需要大量时间才能继续执行

java - 在多个设备上运行移动测试

docker - 在基于Alpine Docker的镜像下运行gitlab-ci.yml脚本时出错