WebDriver容器无法访问DockerComposeContainer服务

时间:2017-12-13 16:36:10

标签: java spring integration-testing testcontainers

我正在尝试使用testcontainers java库来测试使用docker-compose定义的Web应用。

我可以成功公开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);

但是,当我尝试通过webdriver访问服务时,我收到连接拒绝错误 - “localhost拒绝连接”。

@Rule
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
    .withDesiredCapabilities(DesiredCapabilities.chrome());



    RemoteWebDriver driver = chrome.getWebDriver();
    driver.get(url);

我认为webdriver'localhost'仍然是其容器内的localhost,而不是服务所在的主机。

如何让webdriver访问主机网络以访问公开的服务?

1 个答案:

答案 0 :(得分:2)

您正在构建的URL用于从主机系统访问容器(因此它将使用localhost和映射端口)。如果是BrowserWebDriverContainer,则表示localhost无法正常工作。有两种选择:

  1. 您可以使用映射端口并通过Docker主机网络(可能具有类似172.0.0.1的IP)从BrowserWebDriverContainer访问主机
  2. 您可以使用Docker网络将容器相互连接。
  3. Testcontainers最近推出了Docker Network支持,但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注释并手动启动容器。