我可以在 JDBC URL 模式下使用带有自定义 Dockerfile 的 Testcontainers 吗?
Posted
技术标签:
【中文标题】我可以在 JDBC URL 模式下使用带有自定义 Dockerfile 的 Testcontainers 吗?【英文标题】:Can I use Testcontainers in JDBC URL mode with a custom Dockerfile? 【发布时间】:2020-02-06 20:33:49 【问题描述】:我正在测试一个 Spring Boot 应用程序并尝试使用 Testcontainers 在 Docker 容器中为 JUnit 5 测试启动一个临时数据库。有two ways to tell Testcontainers to launch and connect to a test database container:
通过在测试类中定义容器,添加至少几个注解,并且(在 Spring Boot 测试中)还使用几行代码覆盖应用程序上下文以将其指向新数据库。对于每个测试类,这是相当多的额外代码。
通过将 spring.datasource.url
属性设置为经过特殊修改的 URL。最优雅的方法虽然可以说是一个缺点,但它会使测试不太清楚地了解正在发生的事情。
我想使用选项 #2,但限制(我认为)是它要求您使用 PostgreSQL(或任何数据库)的标准(空)“库”映像。我有一个自定义数据库映像,它有自己的 Dockerfile。特别是该图像包含许多初始化脚本(不仅仅是一个)来构建数据库模式。
有什么方法可以将 Testcontainers 的 JDBC URL 配置与自定义 Postgres 图像一起使用?我更愿意将其指向 Dockerfile 并让 Testcontainers 动态生成图像,但我也可以接受我预先构建数据库映像并告诉 Testcontainers 从 Docker Hub 中提取它的解决方案。
作为参考,我的代码在 Github 上的 joeclark-phd/granite 上,而有问题的 Dockerfile 位于“数据库”目录 here 中。一个示例测试用例是AgencyControllerIntegrationTest.java,如果我采用 JDBC URL 方法,您可以看到至少有 15 行代码可以消除。
【问题讨论】:
您能否提供一个 Dockerfile 或告诉我们您使用的是什么基础镜像?您是否使用 docker-compose 文件来执行此操作? @Stefano 我在 Github 上添加了一些代码和 Dockerfile 的链接 【参考方案1】:您的问题有不同的解决方案。我认为对您来说一个不错的解决方案是像这样设置一个application.properties
文件:
spring.datasource.url = $DB_HOST:$DB_PORT/"nameofDB"
spring.datasource.username = $DB_USERNAME
spring.datasource.password = $DB_PASSWORD
您现在应该能够简单地定义容器中的变量。例如
docker run \
-it my_project_name \
-e DB_HOST=myGraniteDB \
-e DB_PORT=5432 \
-e DB_USERNAME=$TEST_DB_USERNAME \
-e DB_USERNAME=$TEST_DB_PASSWORD \
$granite_image_name:$the_tag
或者,您可以像这样简单地启动您的 docker 容器:
docker run \
-it my_project_name \
$granite_image_name:$the_tag \
--spring.datasource.url=$test_db_url
甚至定义一组外部化配置: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
【讨论】:
以上是关于我可以在 JDBC URL 模式下使用带有自定义 Dockerfile 的 Testcontainers 吗?的主要内容,如果未能解决你的问题,请参考以下文章
带有忽略大小写的 JDBC URL 不适用于 H2 数据库连接
Spring Boot jdbc模板在自定义模式下的postgres中找不到表
带有 MyBatis 的 Spring Data JDBC 找不到自定义查询
带有自定义按钮的 HTML5 视频播放器无法在全屏模式下工作