如何在 TestContainers 中创建数据库?

Posted

技术标签:

【中文标题】如何在 TestContainers 中创建数据库?【英文标题】:How to create database in TestContainers? 【发布时间】:2018-06-26 15:55:32 【问题描述】:

我正在使用这个依赖:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>postgresql</artifactId>
    <version>1.5.1</version>
    <scope>test</scope>
</dependency>

这是容器,在我的测试中启动:

@ClassRule
public static PostgreSQLContainer postgres = new PostgreSQLContainer()
    .withDatabaseName("user")
    .withUsername("postgres")
    .withPassword("postgres");

但是当我尝试建立与数据库user 的连接时,我收到异常:

PSQLException: FATAL: database "user" does not exist

在此容器中仅显示默认 DB "postgres"

如何创建数据库"user"

【问题讨论】:

【参考方案1】:

我在 TestContainers 项目中尝试了this test,DB_NAME 设置为“user”,USER/PWD 设置为“postgres”,结果成功。 确保正确配置连接,或考虑JDBC-style containers。

【讨论】:

【参考方案2】:

问题是因为容器返回带有随机端口的 JDBC_URL,并且默认端口可以访问默认 Postgres DB,但你需要一个随机端口

这是解决方法:

@ClassRule
public static DockerComposeContainer environment =
    new DockerComposeContainer(new File("src/test/resources/docker-compose-postgres.yml"))
        .withExposedService("postgres-it", 5432);

这是 docker-compose yml:

version: "2"
    services:
    postgres-it:
        image: postgres
        ports:
            - 5432:5432
        hostname: postgres-it
        environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: postgres
            POSTGRES_DB: user

【讨论】:

以上是关于如何在 TestContainers 中创建数据库?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 Testcontainers R2DBC 中初始化模式?

MySQL TestContainers init-script 模式创建失败

如何在初始化脚本中正确维护 Testcontainers 的数据?

在 Azure Blob 容器中创建两个文件时,如何在 Azure 数据工厂中创建事件触发器?

如何在 Laravel 中创建数据库模式(表)?

如何在特定数据库中创建表?