Запустите образ докера ES с настраиваемым портом, используя testcontainers

Я хочу запустить тесты контейнера, которые запускают образ ES через Docker. После некоторого исследования я обнаружил https://www.testcontainers.org/, и у них также есть встроенный ES-модуль.

Поскольку моя среда разработки использует ES в портах 9200 и 9300, я предпочитаю использовать для своих тестов другие порты, скажем, 1200 и 1300. Поэтому для запуска образа докера из интерфейса командной строки я использую эту команду:

docker run -p 1200:9200 -p 1300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.6.2

Я пробовал делать это с помощью тестовых контейнеров, например:

static ElasticsearchContainer esContainer =
        new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:7.6.2")
                .withExposedPorts(1200, 9200)
                .withExposedPorts(1300, 9300)
                .withEnv("discovery.type", "single-node");
                // .waitingFor(Wait.forHttp("/")); // Wait until elastic start – cause an error

@BeforeClass
public static void initEsDockerImage() {
    esContainer.start();
    esContainer.isRunning();
}

точка останова в esContainer.isRunning ():

порт - 32384, запустите esContainer.getHttpHostAddress() return localhost / 127.0.0.1: 32847, а также из панели инструментов Docker: в любом случае не удалось установить соединение ES с обоими (1200 и 32384).

запустить строку start () с командой **waitingFor**, выдает Container startup failed ошибку

Другой вопрос, как я могу узнать схему (http или https) в тестовых контейнерах?


person AsfK    schedule 20.05.2020    source источник


Ответы (3)


Если вы хотите указать порт вместо случайного, вы можете сделать это следующим образом:

static final MySQLContainer<?> mysql =
    new MySQLContainer<>("mysql:5.6")
        .withExposedPorts(34343)
        .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(
            new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(34343), new ExposedPort(3306)))
        ));
person Felipe Desiderati    schedule 01.04.2021

Я делаю не так. withExposedPorts позволяет нам открывать порты с точки зрения контейнера (что мне не нужно в этом случае, поскольку ElasticContainer уже предоставляет порт http (9200) и порт tcp (9300)).

Чтобы узнать случайный порт на хосте (на котором выполняется тест), на котором были сопоставлены эти порты, вызовите getMappedPort (9200) или, в случае ElasticContainer, чтобы получить host: порт, который вы вызываете getHttpHostAddress ().

Подробнее здесь: https://www.testcontainers.org/features/networking/

В нижней строке измените init на:

static ElasticsearchContainer esContainer =
    new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:7.6.2")
            .withEnv("discovery.type", "single-node");

Получите порт:

int containerPort = esContainer.getMappedPort(9200);

P.S. По поводу схемы - я до сих пор не знаю, но похоже, что testContainer работает на https ..

person AsfK    schedule 21.05.2020

Вам просто нужно привязать определенные порты, так как реализация универсального контейнера по умолчанию связывает произвольный случайный.

    List<String> portBindings = container.getPortBindings();
    portBindings.add(String.format("%d:%d/%s", ES_PORT_HOST, ES_PORT_CONTAINER, InternetProtocol.TCP));
    container.setPortBindings(portBindings);

     // or just in one line if no previous binding required
     // container.setPortBindings(List.of(String.format("%d:%d/%s", ES_PORT_HOST, ES_PORT_CONTAINER, InternetProtocol.TCP)));
person wizardInCloud    schedule 16.07.2021