首页 > 解决方案 > 使用 org.testcontainers 时如何在 docker 容器中包含 postgresql.conf

问题描述

是否可以通过配置为 postgresql 测试容器提供自定义 postgresql.conf 文件?

我已经包含了 Maven 依赖项

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

并为 DB 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 启动的 docker 容器?

编辑 1

谢谢@vilkg,我确实知道 TC_INITSCRIPT 脚本选项和 SET 函数:

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');

问题是

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

标签: postgresqlmavenspring-boottestcontainers

解决方案


如果您想继续使用 JDBC URL 方案启动 Postgres 容器,测试容器可以为您执行 init 脚本。该脚本必须在类路径中,引用如下:

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

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"));

编辑:

如果以上都不起作用,您可以重新配置 Postgres 命令并传递您的自定义配置键。您所需要的只是扩展PostgreSQLContainer并覆盖 configure() 方法。

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

推荐阅读