WebDriver 容器无法访问 DockerComposeContainer 服务
WebDriver container cannot access DockerComposeContainer services
我正在尝试使用 testcontainers java 库来测试使用 docker-compose 定义的网络应用程序。
我可以成功地从 DockerComposeContainer 公开服务并使用 RestTemplate 查询它们。
String url = format(
"http://%s:%s",
environment.getServiceHost("web_1", 8080),
environment.getServicePort("web_1", 8080)
);
ResponseEntity<String> response = template.getForEntity(url, String.class);
但是,当我尝试通过网络驱动程序访问该服务时,出现连接被拒绝错误 - "localhost refused to connect"。
@Rule
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
.withDesiredCapabilities(DesiredCapabilities.chrome());
RemoteWebDriver driver = chrome.getWebDriver();
driver.get(url);
我认为 webdriver 'localhost' 仍然是其容器内的本地主机,而不是暴露服务的主机。
如何让webdriver访问主机网络来访问暴露的服务?
您正在构建的 URL 用于从您的主机系统访问容器(因此它将使用本地主机和映射端口)。在 BrowserWebDriverContainer
的情况下,这意味着 localhost 将不起作用。有两种选择:
- 您可以使用映射的端口并通过 Docker 主机网络从
BrowserWebDriverContainer
访问主机(可能有 172.0.0.1 这样的 IP)
- 您可以使用 Docker 网络将容器相互连接。
Testcontainers 最近引入了 Docker 网络支持,但是 Docker-Compose 容器仍然缺少 ATM 这个功能。
但是您可以像这样手动连接它们(抱歉 Groovy 代码示例,但我认为方法很清楚):
String network = findNetworkIdOfService("vote")
chrome.withNetworkMode(network)
private String findNetworkIdOfService(String service) {
environment.ambassadorContainers.find {
it.key.contains(service)
}.value.containerInfo.networkSettings.networks.values().first().networkID
}
您还需要省略 @Rule
注解并手动启动容器。
我正在尝试使用 testcontainers java 库来测试使用 docker-compose 定义的网络应用程序。
我可以成功地从 DockerComposeContainer 公开服务并使用 RestTemplate 查询它们。
String url = format(
"http://%s:%s",
environment.getServiceHost("web_1", 8080),
environment.getServicePort("web_1", 8080)
);
ResponseEntity<String> response = template.getForEntity(url, String.class);
但是,当我尝试通过网络驱动程序访问该服务时,出现连接被拒绝错误 - "localhost refused to connect"。
@Rule
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
.withDesiredCapabilities(DesiredCapabilities.chrome());
RemoteWebDriver driver = chrome.getWebDriver();
driver.get(url);
我认为 webdriver 'localhost' 仍然是其容器内的本地主机,而不是暴露服务的主机。
如何让webdriver访问主机网络来访问暴露的服务?
您正在构建的 URL 用于从您的主机系统访问容器(因此它将使用本地主机和映射端口)。在 BrowserWebDriverContainer
的情况下,这意味着 localhost 将不起作用。有两种选择:
- 您可以使用映射的端口并通过 Docker 主机网络从
BrowserWebDriverContainer
访问主机(可能有 172.0.0.1 这样的 IP) - 您可以使用 Docker 网络将容器相互连接。
Testcontainers 最近引入了 Docker 网络支持,但是 Docker-Compose 容器仍然缺少 ATM 这个功能。
但是您可以像这样手动连接它们(抱歉 Groovy 代码示例,但我认为方法很清楚):
String network = findNetworkIdOfService("vote")
chrome.withNetworkMode(network)
private String findNetworkIdOfService(String service) {
environment.ambassadorContainers.find {
it.key.contains(service)
}.value.containerInfo.networkSettings.networks.values().first().networkID
}
您还需要省略 @Rule
注解并手动启动容器。