Ubuntu TestContainers не может подключиться к Postgis: 9.5 - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующее определение модуля TestContainers (версия 1.12.2), подготовленного для проверки схемы жидкостной базы в нашем приложении. При попытке выполнить я получаю сообщение об ошибке Connection Refused, как будто ее не существует, однако во время выполнения теста я проверил контейнеры и их состояние:

private static final String DB_URL = String.format("jdbc:postgresql://%s:%s/%s", "localhost", 5432, DB_NAME);

    @Rule
    public final GenericContainer<?> container = 
            new GenericContainer<>("mdillon/postgis:9.5")
                .withExposedPorts(5432)
                .withEnv("POSTGRES_USER", USER)
                .withEnv("POSTGRES_PASSWORD", PASSWORD)
                .withEnv("POSTGRES_DB", DB_NAME);

    @Test
    public void transactionSchemaWasUpdated() throws Exception {
        try (Connection connection = DriverManager.getConnection(DB_URL, USER, PASSWORD)) {
            // GIVEN
            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
            database.setDefaultSchemaName(SCHEMA);
            Liquibase liquibase = new Liquibase("install.xml", new ClassLoaderResourceAccessor(), database);
            liquibase.setChangeLogParameter("schemaName", SCHEMA);
            // WHEN
            liquibase.update("main");
            // THEN
            assertEquals(getAppVersion(), getDbVersion(connection));
        }
    }

Docker ls результат во время выполнения тестов :

378e828e4149        mdillon/postgis:9.5                 "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:32784->5432/tcp   thirsty_stonebraker
6a270c963322        quay.io/testcontainers/ryuk:0.2.3   "/app"                   8 seconds ago       Up 7 seconds        0.0.0.0:32783->8080/tcp   testcontainers-ryuk-78a4fc8d-4fb9-41bf-995f-b31076b02465

Ошибка:

org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

1 Ответ

2 голосов
/ 20 февраля 2020

Когда порт открыт в тест-контейнерах, он фактически не использует тот же порт, но другой. Согласно документации :

С точки зрения хоста Testcontainers фактически выставляет это на случайном свободном порте. Это сделано для того, чтобы избежать коллизий портов, которые могут возникнуть с локально работающим программным обеспечением или между параллельными тестовыми прогонами.

Вам необходимо запросить у контейнера отображенный порт:

Integer actualPostgresPort = container.getMappedPort(5432);

Если вы проанализируете вывод docker ps, вы увидите, что порт 5432 не открыт, а вместо этого 32784.

...