2017-12-13 27 views
1

testcontainers 자바 라이브러리를 사용하여 docker-compose로 정의 된 웹 응용 프로그램을 테스트하려고합니다.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); 

그러나, 나는 연결 거부 오류 - "로컬 호스트 연결을 거부".

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



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

웹 드라이브 'localhost'는 서비스가 노출 된 호스트가 아닌 컨테이너 내부의 localhost라고 생각합니다.

노출 된 서비스에 액세스하기 위해 webdriver가 호스트 네트워크에 액세스하게하려면 어떻게해야합니까?

답변

1

작성중인 URL은 호스트 시스템에서 컨테이너에 액세스하는 데 사용되므로 로컬 호스트와 매핑 된 포트를 사용합니다. BrowserWebDriverContainer의 경우 이는 로컬 호스트가 작동하지 않음을 의미합니다. 두 가지 옵션이 있습니다 :

    매핑 된 포트를 사용하고 연결 도커 네트워크를 사용할 수 있습니다
  1. (172.0.0.1 같은 IP를 가질 수 있음) 도커 호스트 네트워크를 통해 BrowserWebDriverContainer에서 호스트에 액세스 할 수 있습니다
  2. 컨테이너 서로.

Testcontainers는 최근 Docker 네트워크 지원을 도입했지만 Docker-Compose 컨테이너에는 여전히이 기능 ATM이 없습니다.

당신은 그러나 수동으로 다음과 같이 연결할 수 있습니다 (그루비 코드 예를 들어 미안하지만 난 방법은 분명하다 생각) :

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

Docker 호스트 IP를 사용하는 솔루션 1이 작동했습니다. 자바에서 environment.ambassadorContainers를 찾을 수 없습니다. – Rod

+0

'environment'는 작성 컨테이너의 이름이고, Java에서는'getAmbassadorContainers()'를 호출해야합니다. –