Не удается подключиться к экземпляру Postgres testcontainer

Я создал экземпляр Postgres с помощью testcontainers. Контейнер запускается, но я не могу получить к нему доступ.

Я попытался подключиться к контейнерной БД с помощью DBeaver. В консоли eclipse вроде все нормально:

01: 29: 34.662 [основной] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: com.github.dockerjava.core.command.CreateContainerCmdImpl@73386d72 [name =, hostName =, domainName =, user =, attachStdin =, attachStdout =, attachStderr =, portSpecs =, tty =, stdinOpen =, stdInOnce =, env = {POSTGRES_USER = test, POSTGRES_PASSWORD = test, POSTGRES_DB = ASIGDB_TEST}

Вот мой код:

public class CustomPostgresContainer extends PostgreSQLContainer<CustomPostgresContainer>{
    private static final String IMAGE_VERSION = "postgres:9.6";
    private static CustomPostgresContainer customPostgresContainer;
    private static final int EXPOSED_PORT = 5555;
    private static final String DB_NAME = "ASIGDB_TEST";
    private static final String DB_USER= "test";
    private static final String DB_PASSWORD= "test";


    public CustomPostgresContainer() {
        super(IMAGE_VERSION);
    }

    public static CustomPostgresContainer getCustomPostgresContainerInstance() {
        if(customPostgresContainer == null) {
            return extracted().withExposedPorts(EXPOSED_PORT)
                                                .withDatabaseName(DB_NAME)
                                                .withUsername(DB_USER)
                                                .withPassword(DB_PASSWORD);
        }

        return customPostgresContainer;
    }

    private static CustomPostgresContainer extracted() {
        return new CustomPostgresContainer();
    }

    @Override
    public void start() {
        super.start();
    }

    @Override
    public void stop() {
        //do nothing, JVM handles shut down
    }
}

Я получил:

Подключение к localhost: 5555 отказано. Убедитесь, что имя хоста и порт указаны правильно, и что почтмейстер принимает соединения TCP / IP.

Кто-нибудь знает что происходит?


person Kiroshi    schedule 28.09.2019    source источник


Ответы (1)


Согласно этой ссылке, withExposedPorts() -> этот открытый номер порта является контейнер.
С точки зрения хоста Testcontainers фактически предоставляет это на случайном свободном порту. Это сделано специально, чтобы избежать конфликтов портов, которые могут возникнуть из-за локального программного обеспечения или между параллельными тестовыми запусками.
Поскольку существует этот уровень косвенного обращения, необходимо запрашивать у Testcontainer фактический отображаемый порт во время выполнения. Это можно сделать с помощью метода getMappedPort, который принимает исходный порт (контейнер) в качестве аргумента:

Integer firstMappedPort = container.getMappedPort(yourExposedPort);<br/>

Попробуйте подключиться с помощью DBeaver к порту, который появляется первым.

Снимок экрана с портами

person Vitalii Lotoskyi    schedule 01.10.2019
comment
Спасибо Виталию. Я действительно неверно истолковал перспективу открытого порта. По сути, любой запрос к точке входа докера (который отображается на этом случайном порте), запущенный testcontainers, перенаправляется в экземпляр postgres по умолчанию, который работает внутри контейнера (5432) И открытый порт, который был добавлен мной (5555). Спасибо еще раз. - person Kiroshi; 02.10.2019