我正在尝试使用 Kotlin 中的 OpenSearch 的 JUnit 测试容器和 Spring Boot 框架。 (足够的限定符?)我已经能够让它大部分工作,大致如下:
class TestConfiguration : ApplicationContextInitializer<ConfigurableApplicationContext> {
val container = OpensearchContainer(
DockerImageName.parse("opensearchproject/opensearch:2.11.1")
)
override fun initialize(applicationContext: ConfigurableApplicationContext) {
container.start()
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
applicationContext,
"opensearch.username=${container.getUsername()}",
"opensearch.password=${container.getPassword()}",
"opensearch.host=${container.getHost()}",
"opensearch.scheme=http",
"opensearch.port=${container.getFirstMappedPort()}",
)
}
}
(也就是说,我们启动容器,然后将用户/通行证/主机/端口从中取出,并将其粘贴到属性中,以便 OpenSearch 客户端获取这些属性并连接到测试容器实例。)
上面的内容似乎确实按预期工作。 但是,我不想使用普通的上游 OpenSearch 图像。 我需要安装一个 OpenSearch 插件,这意味着我有一个自定义的
Dockerfile
,如下所示:
FROM opensearchproject/opensearch:2.11.1
RUN bin/opensearch-plugin install analysis-phonetic
当我从
docker-compose.yml
引用它时效果非常好。 然而,我一生都无法弄清楚如何让测试容器使用自定义Dockerfile
。 这似乎在一定程度上是 OpenSearchContainer
类的问题,实际上除了 DockerImageName
实例之外不允许任何东西作为参数,尽管它的父级 GenericContainer
支持更多。 但不使用 OpenSearchContainer
意味着我无权访问用户或密码;尽管查看类,它们只是硬编码的常量。
有
ImageFromDockerfile
(参见:https://java.testcontainers.org/features/creating_images/),不过这似乎只适用于GenericContainer
,不适用于OpenSearchContainer
。
我尝试使用
DockerComposeContainer
支持(参见:https://codeal.medium.com/how-to-run-docker-compose-with-testcontainers-7d1ba73afeeb),但我不断收到错误无法解密尝试引用 docker-compose.yml
文件。 如果我尝试将文件名包装在 File
实例中,它就会崩溃。 如果我不这样做,那么它会运行,但似乎找不到该文件,因此不会加载任何内容。
有人成功做到过吗? 知道我该怎么做吗?
谢谢。