Как включить postgresql.conf в контейнер докера при использовании org.testcontainers - PullRequest
0 голосов
/ 19 февраля 2019

Можно ли дать postgresql testcontainer собственный файл postgresql.conf через config?

Я включил зависимость maven

<dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>postgresql</artifactId>
            <version>1.10.6</version>
</dependency>

И использую «Контейнеры базы данных, запущенные через схему URL JDBC» для URL БД. Таким образом, в моем приложении Spring Boot установлены следующие параметры:

datasource:
    url: jdbc:tc:postgresql:10-alpine:///databasename
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver

Мне нужно иметь пользовательские настройки в postgresql.conf.Есть ли способ отправить postgresql.conf в контейнер докеров, запущенный testcontainers?

РЕДАКТИРОВАТЬ 1

Спасибо @vilkg Я, однако, знал о опции сценария TC_INITSCRIPT и функции SET:

  • Я хочу пользовательскийтакие настройки, как my.key
  • Система ALTER не работает для ваших собственных настроек, например: ALTER SYSTEM SET my.key = 'jehe';получить ошибку Не удалось выполнить команду SQL.Возвращено сообщение: `ОШИБКА: нераспознанный параметр конфигурации" my.key "
  • Ранее я пытался установить SET и ALTER DATABASE, как показано ниже
SET my.key = 'new  value 8';    -- sets for current session 
ALTER DATABASE test SET my.key = 'new  value 8';  -- sets for subsequent sessions
select current_setting('my.key');

ПРОБЛЕМА IS

  • , когда testcontainer запускает контейнер postgres, и я передаю ему сценарий инициализации для запуска url: jdbc:tc:postgresql:10-alpine:///databasename?TC_INITSCRIPT=init_pg.sql
    • , и я могу включить вышеприведенный SQL его счастливым.
    • Iзнать, что настройка этого secret.key работает правильно в этом скрипте, потому что он не будет работать в строке select current_setting ('my.key');если два других закомментированы
    • Я также знаю, что запуск его с проверкой имени db корректен, например: 'ALTER DATABASE test', потому что, если я использую другое имя, он завершается неудачно Testcontainers автоматически подключает приложение к базе данных с именем test.со всем вышеперечисленным я считаю, что БД настроена правильно и все должно быть хорошо

НО Когда я использую 'current_setting (' my.key ') 'в коде приложения не получается

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

мы должны создать нашу базу данных и пользователя соединения.Это делается с помощью переменных среды из образа Docker.Чтобы изменить postgres.conf, мы можем использовать DockerFIle, где мы заменим существующий файл postgres.conf новой конфигурацией.

@ClassRule
public static GenericContainer postgresql= new GenericContainer(
  new ImageFromDockerfile("postgresql:10-alpine")
   .withDockerfileFromBuilder(dockerfileBuilder -> {
      dockerfileBuilder.from("myPostgresql:10-alpine")
      // root password is mandatory
      .env("PG_ROOT_PASSWORD", "root_password")
      .env("PG_DATABASE", "postgres")
      .env("PG_USER", "postgres")
      .env("PG_PASSWORD", "postgres")
})

Далее нам нужно создать схему базы данных и заполнить базу данных.Из документации к изображениям каталог /docker-entrypoint-initdb.d сканируется при запуске и выполняются все файлы с расширением .sh, .sql et .sql.gz.Итак, мы просто должны поместить наши файлы schema.sql и data.sql в этот каталог.Параметры Somme могут быть установлены с помощью sql, запрашивающего работающую базу данных

.withFileFromClasspath("a_schema.sql", "db/pg/schema.sql")
.withFileFromClasspath("b_data.sql", "db/pg/data.sql"))
0 голосов
/ 11 марта 2019

Если вы хотите продолжить запуск контейнера Postgres с использованием схемы URL JDBC, тестовые контейнеры могут выполнить сценарий инициализации для вас. Этот сценарий должен находиться в пути к классам, на который ссылаются следующим образом:

jdbc:tc:postgis:9.6://hostname/databasename?TC_INITSCRIPT=somepath/init.sql

Команда ALTER SYSTEM SET была введена в postgres 9.4 , поэтому вы можете использовать ее в своем скрипте инициализации.

Другой вариант - запуск контейнера postgres с использованием объектов контейнеров базы данных и использование withCopyFileToContainer () метод.Пример:

JdbcDatabaseContainer<?> postgisContainer = new PostgisContainerProvider()
        .newInstance()
        .withDatabaseName( POSTGRES_DATABASE_NAME )
        .withUsername( POSTGRES_CREDENTIALS )
        .withPassword( POSTGRES_CREDENTIALS )
        .withCopyFileToContainer(MountableFile.forClasspathResource("postgresql.conf"), "/var/lib/postgresql/data"));

РЕДАКТИРОВАТЬ:

Если ничего из вышеперечисленного не работает, вы можете перенастроить команду Postgres и передать свои пользовательские ключи конфигурации.Все, что вам нужно, это расширение PostgreSQLContainer и переопределение метода configure ().

@Override
protected void configure()
{
     setCommand( "postgres -c $your_config_key=$your_config_value"   );
}
...