为什么我不能从我的GitLab工作连接到SeleniumDocker-Compose服务? [英] Why can't I connect to selenium docker-compose service from my GitLab job?
问题描述
我正在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
配置通常允许您的作业通过主机名与容器通信。但是,此配置错误的原因有两个:
- 此配置仅适用于运行器容器旁边的容器。这是在主机守护进程上注册的其他容器--而不是由其他停靠程序守护进程创建的容器,如通过与
docker:dind
服务守护进程对话而在您的作业中使用docker-compose
创建的容器。 - 即使您可以访问其他守护程序创建的容器,或者您的集线器容器是由主机守护程序创建的,根据您尝试的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屋!