为什么我无法从我的 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
配置通常允许您的作业通过主机名与容器通信。但是,由于两个原因,此配置是错误的:
- 此配置只能应用于 容器以及 您的 运行 容器。那是在主机守护进程上注册的其他容器——不是由其他 docker 守护进程创建的容器,例如通过与
docker:dind
服务守护进程对话在您的工作中使用 docker-compose
创建的容器。
- 即使您可以访问由其他守护程序创建的容器,或者您的集线器容器是由主机守护程序创建的,根据您尝试的 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 之间的网络工作方式的文章之一。
我正在 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
配置通常允许您的作业通过主机名与容器通信。但是,由于两个原因,此配置是错误的:
- 此配置只能应用于 容器以及 您的 运行 容器。那是在主机守护进程上注册的其他容器——不是由其他 docker 守护进程创建的容器,例如通过与
docker:dind
服务守护进程对话在您的工作中使用docker-compose
创建的容器。 - 即使您可以访问由其他守护程序创建的容器,或者您的集线器容器是由主机守护程序创建的,根据您尝试的 URLS,参数是错误的。此配置基本上是说“将
selenium__hub
容器公开为 FQDNhub
”——但您从未尝试过主机名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 之间的网络工作方式的文章之一。