在 Gradle 任务中启动 Postgres TestContainer

问题描述 投票:0回答:1

我正在学习 Gradle,我正在尝试执行以下操作:

  1. 在 Gradle 任务中,使用 sql 初始化脚本启动 postgres testcontainer。
  2. 使用 Jooq codegen 从该数据库生成源代码。

目前,我正在研究第 1 点。我尝试在任务中启动一个 postgres 容器:

abstract class StartDbContainer : DefaultTask() {

    @TaskAction
    fun startContainer() {
        PostgreSQLContainer(DockerImageName.parse("postgres:17.0")).apply {
            withUsername("user")
            withPassword("password")
            withDatabaseName("test")
            withInitScript("schema.sql")
            start()
        }
    }
    
}

然后我将

schema.sql
添加到构建脚本类路径中,如下所示:

buildscript {

    dependencies {
        // <some other dependencies>
        classpath(files("src/main/resources/schema.sql"))
    }

}

但是,执行此任务失败:

org.testcontainers.ext.ScriptUtils$ScriptLoadException: Could not load classpath init script: schema.sql. Resource not found.

我尝试将

withInitScript("schema.sql")
更改为
withInitScript(""src/main/resources/schema.sql")
但这也不起作用。

谁能告诉我这是怎么回事?我是否对 gradle buildscript 类路径的工作方式存在误解,或者 testcontainers 不是为此而构建的?

java kotlin gradle jooq testcontainers
1个回答
0
投票

对于尝试类似操作的人,我找到了解决方法。

Docker postgres 容器具有此属性,您还可以在

/docker-entrypoint-initdb.d
挂载 init 脚本,该脚本将在启动时执行。

因此,我们可以按如下方式进行这项工作:

        val schemaPath = layout.projectDirectory.file("src/main/resources/schema.sql").asFile.path

        val container = PostgreSQLContainer(DockerImageName.parse("postgres:17.0")).apply {
            withCopyToContainer(MountableFile.forHostPath(schemaPath), "/docker-entrypoint-initdb.d/init.sql")
            start()
        }

此处描述

© www.soinside.com 2019 - 2024. All rights reserved.