2017-12-13 13 views
1

testcontainers Javaライブラリを使用して、docker-composeで定義されたWebアプリケーションをテストしようとしています。WebDriverコンテナがDockerComposeContainerサービスにアクセスできない

DockerComposeContainerからサービスが正常に公開され、RestTemplateを使用してそれらをクエリできます。私はwebdriverを介してサービスにアクセスしようとすると、

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の接続を拒否しました」。

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



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

webdriver 'localhost'は、サービスが公開されているホストではなく、コンテナ内にlocalhostです。

公開されているサービスにアクセスするためにwebdriverがホストネットワークにアクセスするにはどうすればよいですか?

答えて

1

ビルドしているURLは、ホストシステムからコンテナにアクセスするために使用されるため、ローカルホストとマップされたポートが使用されます。 BrowserWebDriverContainerの場合、これはlocalhostが動作しないことを意味します。 2つのオプションがあります。

    あなたは、マッピングされたポートを使用して、接続するためにドッカーネットワークを使用することができます
  1. (172.0.0.1などのIPを持っている可能性がある)ドッカーホストネットワークを介してBrowserWebDriverContainerからホストにアクセスすることができます
  2. 容器同士を互いに密着させる。

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注釈を省略して、手動でコンテナを起動する必要があります。

+0

解決策1 DockerホストIPを使用しました。 environment.ambassadorContainersをJavaで見つけることができませんでした。 – Rod

+0

'environment'はあなたの作成コンテナの名前ですが、Javaでは' getAmbassadorContainers() 'も呼び出す必要があります。 –

関連する問題