Эластичный поиск TestContainers Превышено время ожидания доступа к URL в Docker. - PullRequest
0 голосов
/ 28 сентября 2019

Локальное env:

  • MacOS 10.14.6
  • Docker Desktop 2.0.1.2
  • Docker Engine 19.03.2
  • Compose Engine 1.24.1
  • Тестовые контейнеры 1.12.1

Я использую поиск Elastic в приложении и хочу иметь возможность использовать TestContainers в моих интеграционных тестах.Пример кода в приложении Play Framework, в котором используется тестовый контейнер ElasticSearch:

@BeforeAll
public static void setup() {
    private static final ElasticsearchContainer ES = new ElasticsearchContainer();
    ES.start();
}

Это работает при локальном тестировании, но я хочу иметь возможность запускать его внутри контейнера Docker для запуска на моем CI-сервере.Я получаю это исключение при запуске тестов внутри контейнера Docker:

[warn] o.t.u.RegistryAuthLocator - Failure when attempting to lookup auth config (dockerImageName: alpine:3.5, configFile: /root/.docker/config.json. Falling back to docker-java default behaviour. Exception message: /root/.docker/config.json (No such file or directory)
[warn] o.t.u.RegistryAuthLocator - Failure when attempting to lookup auth config (dockerImageName: quay.io/testcontainers/ryuk:0.2.3, configFile: /root/.docker/config.json. Falling back to docker-java default behaviour. Exception message: /root/.docker/config.json (No such file or directory)
        ?? Checking the system...
        ? Docker version should be at least 1.6.0
        ? Docker environment should have more than 2GB free disk space
[warn] o.t.u.RegistryAuthLocator - Failure when attempting to lookup auth config (dockerImageName: docker.elastic.co/elasticsearch/elasticsearch:7.1.1, configFile: /root/.docker/config.json. Falling back to docker-java default behaviour. Exception message: /root/.docker/config.json (No such file or directory)
[error] d.e.c.1.1] - Could not start container
org.testcontainers.containers.ContainerLaunchException: Timed out waiting for URL to be accessible (http://172.17.0.1:32911/ should return HTTP [200])
    at org.testcontainers.containers.wait.strategy.HttpWaitStrategy.waitUntilReady(HttpWaitStrategy.java:197)
    at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:35)
    at org.testcontainers.containers.GenericContainer.waitUntilContainerStarted(GenericContainer.java:675)
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:332)
    at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:285)
    at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
    at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:283)
    at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:272)
    at controllers.HomeControllerTest.setup(HomeControllerTest.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Я прочитал инструкции здесь: https://www.testcontainers.org/supported_docker_environment/continuous_integration/dind_patterns/

Так что мой docker-compose.yml выглядит так(примечание: я тестировал с другим контейнером ES, как показано ниже, но я не использовал его в этом тесте) ($ INSTANCE - это случайная строка из 16 символов для определенного прогона теста):

version: '3'

services:
  # elasticsearch:
  #   container_name: elasticsearch_${INSTANCE}
  #   image: docker.elastic.co/elasticsearch/elasticsearch:6.7.2
  #   ports:
  #     - 9200:9200
  #     - 9300:9300
  #   command: elasticsearch -E transport.host=0.0.0.0
  #   logging:
  #     driver: 'none'
  #   environment:
  #     ES_JAVA_OPTS: "-Xms750m -Xmx750m"
  mainapp:
    container_name: mainapp_${INSTANCE}
    image: test_image:${INSTANCE}
    stop_signal: SIGKILL
    stdin_open: true
    tty: true
    working_dir: $PWD
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - $PWD:$PWD
    environment:
      ES_JAVA_OPTS: "-Xms1G -Xmx1G"
    command: /bin/bash /projectfolder/build/tests/wrapper.sh

Я также пытался выполнить свои тесты с помощью этой команды, но получил ту же ошибку:

docker run -it --rm -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock test_image:68F75D8FD4C7003772C7E52B87B774F5 /bin/bash /testproject/build/tests/wrapper.sh

Я попытался создать контейнер postgres таким же образом внутри моего контейнера тестирования ине было проблем.Я также безуспешно пытался создать GenericContainer с образом Elasticsearch.

Я не думаю, что это проблема подключения, потому что, если я запускаю curl 172.17.0.1:{port printed to test console} из моего тестового контейнера, я получаю действительныйэластичный поисковый ответ с кодом состояния 200, так что кажется, что его время ожидания попытки установить соединение даже при наличии соединения.

Спасибо.

...