我正在学习 Gradle,我正在尝试执行以下操作:
目前,我正在研究第 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 不是为此而构建的?
对于尝试类似操作的人,我找到了解决方法。
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()
}
如此处描述