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

2024-03-02

我正在 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:dind容器。当你调用docker-compose你的工作容器与docker:dind容器反过来会启动一个新的 docker 网络,并在该网络上的 compose 文件中创建 docker 容器。

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

然而,docker执行者does创建一个链接到您的services:IE。这docker:dind服务。这样你就可以到达that容器由docker主机名。此外,您的撰写文件指示集线器服务应进行端口映射4444:4444从主机 -> 容器。在这种情况下,主机是指docker:dind服务。所以打电话http://docker:4444从您的工作地点到达枢纽服务。

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

最后,为了涵盖最后一个细节,看起来在您的跑步者配置中您期望您的links允许您通过主机名与 hub 容器进行通信:

  links = ["selenium__hub:hub"]

在跑步者配置中,确实links一般来说,配置将允许您的作业通过主机名与容器进行通信。然而,由于以下两个原因,此配置是错误的:

  1. 此配置仅适用于容器旁边你的跑步者容器。这是在主机守护进程上注册的其他容器 - 不是由其他 docker 守护进程创建的容器,例如使用创建的容器docker-compose在你的工作中通过与docker:dind服务守护进程。
  2. 即使你could根据您尝试的 URL,到达其他守护进程创建的容器,或者您的集线器容器是由主机守护进程创建的,参数错误。这个配置基本上是说“暴露selenium__hub容器作为 FQDNhub“——但你从未尝试过主机名hub.

没有什么可以fix这里是因为使用 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:键以减少所需的作业配置量。

您可能还有兴趣查看其中之一我的其他答案 https://stackoverflow.com/a/69847589/5747944 on how FF_NETWORK_PER_BUILD功能标志可以影响 docker 容器和作业/服务之间的网络工作方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 解码字符串中的“=C3=A4”

    我尝试了很多不同的方法来正确显示我的字符串 但我无法使其工作 这就是字符串 f C3 A4hrt German word f hrt 我的文件以 utf 8 编码 该文件在 Joomla 中加载 我都尝试过 geschichte gt in
  • Elastic BeanStalk EC2 实例的日志耗尽了整个磁盘空间

    我有一个 Elastic BeanStalk 环境 在 1 个 EC2 实例上运行我的应用程序 当我最初配置环境时 我添加了负载均衡器 但从那时起我将其设置为仅使用 1 个实例 在容器内运行的应用程序显然会产生大量日志 几天后它们会耗尽整个
  • 如何使用 React hook 检测 Next.js SSR 中的窗口大小?

    我正在使用 Next js 构建一个应用程序反应日期 https github com airbnb react dates 我有两个组件日期范围选择器组件和DayPickerRangeController成分 我想渲染日期范围选择器当窗口
  • 将动态二维数组传递给函数

    我正在用 C 编写一个 n x n 矩阵乘法程序 其中 a 和 b 是输入 x 是输出 a b 和 x 已分配 但我不确定如何正确地将指针传递给乘法函数 下面是我想做的事情的概述 void multiplication float a fl
  • 如何在不冒失去对称属性的风险的情况下用hibernate实现equals?

    在阅读了 再次 很久以前就应该这样做 正确实现 equals 和 hashcode 后 我得出了这些结论 这对我有用 如果是 JDK 7 之前的版本 更喜欢使用 Apache commons equalsbuilder 和 hashcode
  • Java内部类和私有字段的可见性

    直到今天我才意识到这一点 但在 Java 中 私有字段在内部类上并不是真正私有的 您可以实例化一个类并访问这些字段 就好像它们是公共的一样 我的问题是为什么这是用 Java 完成的 哪些设计决策导致了封装的破坏 允许这样做有什么好处吗 pu
  • 转换为同一个类时出现 ClassCastException

    我有 2 个不同的 Java 项目 其中一个有 2 个类 dynamicbeans DynamicBean2 and dynamic Validator 在另一个项目中 我动态加载这两个类并将它们存储在Object class Form C
  • 字符串仅包含给定的字符集

    我需要知道给定的字符串是否是有效的日期时间格式字符串 因为该字符串可能代表其他内容 我尝试了 DateTime ParseExact somedate ToString format format 认为它会因无效格式而呕吐 但事实并非如此
  • 从匿名函数作用域中提取数据

    由于此应用程序的复杂性 我需要包装 Facebook API 调用 如下所示 In main file read is always undefined var read fb connect readStream In fb wrappe
  • 算法帮忙!与其伙伴一起搜索字符串的快速算法

    我正在寻找一种用于在巨大字符串中进行搜索的快速算法 它是由数亿到数十亿个字符组成的生物体基因组序列 该字符串中仅存在 4 个字符 A C G T 并且 A 只能与 T 配对 而 C 与 G 配对 现在我正在搜索两个可以反向并行配对的子字符串
  • 在 Markdown 上使用 Pandoc 时,如何从 YAML 标头中更改 PDF 输出字体?

    是否有一种 内置 方法可以设置在 Pandoc YAML 标头中使用的不同字体 或多种字体 理想情况下 我会在 Markdown 文件的 YAML 标头中执行类似的操作 font MySansSerifFontName 我在 Linux U
  • jslint --edition=latest 意外的 ES6 功能。常量

    我正在尝试使用node jslinthttps github com reid node jslint https github com reid node jslint为了保持我的代码干净 我的 nodejs 脚本中有一个 const 但
  • 诺基亚 6300 出现应用程序错误

    我正在使用这段代码来连接 Servlet 尝试访问互联网时的移动应用程序 手机中出现以下消息 允许网络访问 是或否 如果我在诺基亚 6300 中对该消息单击 否 则会出现 应用程序错误 警告 并且会自动关闭该应用程序 我尝试过其他诺基亚手机
  • spring singleton bean 字段未填充

    我需要一个带有一些内部字段的服务 单例 比如待处理线程的列表 是的 所有内容都被编写为线程安全的 问题是 如果我 autowire这个 bean 的字段似乎是空的 调试我发现代理正确绑定到实例 字段CGLIB CALLBACK X正确链接到
  • 命名管道读取超时

    我正在尝试为命名管道的读取操作设置超时 为了从命名管道中读取数据 我使用ReadFile功能 我读到可以使用以下命令为此函数设置超时SetCommTimeouts函数 但当我尝试使用它时 出现系统错误 1 函数不正确 这是我的代码 这是客户
  • 如何将外部 javascript 文件添加到 Zend Framework 2 应用程序?

    我需要将 jQuery 和其他 javascript 文件添加到我的 Zend Framework 项目中 我正在尝试使用动作控制器来做到这一点 public function userinfoAction this gt view gt
  • Visual Studio 中无法下载 Cordova 插件错误

    我正在尝试在 Visual Studio 2015 中为我的 cordova 应用程序安装插件 但出现错误 Couldn t download plugin 如果我尝试使用 CLI 安装它 错误是 Current Directory is
  • iAd 横幅在模拟器上显示测试广告,但在设备上不显示

    我正在尝试在我的 iPhone 应用程序上放置 iAd 横幅 这是我声明横幅广告的地方 void bannerViewDidLoadAd ADBannerView banner UIView beginAnimations nil cont
  • C++代码可视化

    一种后续 相关问题this https stackoverflow com questions 27857 c c source code visualization 我试图掌握一个拥有数百个类和一个大型继承层次结构的大型代码库 我希望能够
  • 为什么我无法从我的 GitLab 作业连接到 selenium docker-compose 服务?

    我正在 Gitlab CI 中运行 selenium 测试 但在使用 gitlab 运行程序而不是我的计算机时 无法正确设置远程 URL 跑步者的IP地址是192 168 xxx xxx 当我运行管道时 我得到的 selenium hub