Локальное 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, так что кажется, что его время ожидания попытки установить соединение даже при наличии соединения.
Спасибо.