这里的问题是当你的工作使用启动容器时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
一般来说,配置将允许您的作业通过主机名与容器进行通信。然而,由于以下两个原因,此配置是错误的:
- 此配置仅适用于容器旁边你的跑步者容器。这是在主机守护进程上注册的其他容器 - 不是由其他 docker 守护进程创建的容器,例如使用创建的容器
docker-compose
在你的工作中通过与docker:dind
服务守护进程。
- 即使你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 容器和作业/服务之间的网络工作方式。