为什么我不能从我的GitLab工作连接到SeleniumDocker-Compose服务? [英] Why can't I connect to selenium docker-compose service from my GitLab job?

查看:5
本文介绍了为什么我不能从我的GitLab工作连接到SeleniumDocker-Compose服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在GitLab CI中运行Selify测试,但在使用GitLab运行器而不是我的计算机时,无法正确设置远程URL。

跑者的IP地址为192.168.xxx.xxx。当我运行管道时,我得到SelSelum集线器的IP地址是172.19.0.2/16。我两个都试过了,都失败了。我还尝试使用Selify集线器容器的名称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

我尝试的远程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 Runner一起使用?

推荐答案

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

假设您在作业中使用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容器进行对话,后者进而启动一个新的停靠站网络,并在该网络上的合成文件中创建停靠站容器。

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

但是,停靠执行器确实创建了指向services:docker:dind服务的链接。因此您可以通过docker主机名访问容器。此外,您的合成文件表明,集线器服务应该从主机-&>继续进行4444:4444的端口映射。在本例中,主机指的是docker:dind服务。因此,从您的作业呼叫http://docker:4444会到达集线器服务。

为什么";链接不起作用?

最后,为了介绍最后一个细节,在您的运行器配置中,您希望links允许您通过主机名

与集线器容器通信
  links = ["selenium__hub:hub"]

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

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

此处没有要修复的,因为(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功能标志如何影响停靠容器和作业/服务之间的网络工作方式的内容。

这篇关于为什么我不能从我的GitLab工作连接到SeleniumDocker-Compose服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆