使用org.testcontainers时如何在Docker容器中包含postgresql.conf

Mel*_*ssa 8 postgresql maven spring-boot testcontainers

是否可以通过配置为postgresql testcontainer提供自定义的postgresql.conf文件?

我已经包括了Maven依赖

<dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>postgresql</artifactId>
            <version>1.10.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

并使用“通过JDBC URL方案启动的数据库容器”作为数据库URL,因此在Spring Boot应用程序中的设置如下:

datasource:
    url: jdbc:tc:postgresql:10-alpine:///databasename
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
Run Code Online (Sandbox Code Playgroud)

我需要在postgresql.conf中有一个自定义设置。有没有一种方法可以将postgresql.conf推送到由testcontainers启动的docker容器中?

编辑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');
Run Code Online (Sandbox Code Playgroud)

问题是

  • 当testcontainer启动postgres容器时,我将其传递给init脚本来运行 url: jdbc:tc:postgresql:10-alpine:///databasename?TC_INITSCRIPT=init_pg.sql
    • 并且我可以将上面的SQL包括在内。.
    • 我知道该secret.key的设置在此脚本中正常工作,因为在选择select_current_setting('my.key')的行上它将失败。如果另外两个被注释掉
    • 我也知道针对数据库名称测试运行它是正确的,例如:'ALTER DATABASE test',因为如果我使用其他名称,它将失败,Testcontainers会自动将应用程序连接到名为test的数据库。因此,我相信以上所有内容都可以很好地设置数据库一切都应该很好

但是, 当我在应用程序代码中使用“ current_setting('my.key')”时,它将失败

vil*_*lkg 6

如果要继续使用JDBC URL方案启动Postgres容器,则测试容器可以为您执行初始化脚本。该脚本必须位于类路径上,其引用如下:

jdbc:tc:postgis:9.6://hostname/databasename?TC_INITSCRIPT=somepath/init.sql
Run Code Online (Sandbox Code Playgroud)

ALTER SYSTEM SET命令是在postgres 9.4中引入的,因此您可以在init脚本中使用它。

另一个选择是使用数据库容器对象启动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"));
Run Code Online (Sandbox Code Playgroud)

编辑:

如果以上方法均无效,则可以重新配置Postgres命令并传递自定义配置密钥。您所需要做的就是扩展PostgreSQLContainer并覆盖configure()方法。

@Override
protected void configure()
{
     setCommand( "postgres -c $your_config_key=$your_config_value"   );
}
Run Code Online (Sandbox Code Playgroud)