我可以在 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 视频播放器无法在全屏模式下工作

带有自定义 url 的 RKResponseDescriptor

DSX PySpark 使用自定义 JDBC 方言将数据写入 dashDB