Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 我可以在JDBCURL模式下使用带有自定义Dockerfile的Testcontainers吗?_Spring Boot_Docker_Testcontainers - Fatal编程技术网

Spring boot 我可以在JDBCURL模式下使用带有自定义Dockerfile的Testcontainers吗?

Spring boot 我可以在JDBCURL模式下使用带有自定义Dockerfile的Testcontainers吗?,spring-boot,docker,testcontainers,Spring Boot,Docker,Testcontainers,我正在测试一个Spring启动应用程序,并尝试使用Testcontainers在Docker容器中启动一个临时数据库,以进行JUnit 5测试。有: 通过在测试类中定义容器,添加至少两个注释,以及(在Spring引导测试中)用几行代码覆盖应用程序上下文,将其指向新数据库。对于每个测试类,这是相当多的额外代码行 通过将spring.datasource.url属性设置为经过特殊修改的url。最优雅的方法,尽管可以说是一个缺点,是这使得测试对正在发生的事情不那么明确 我想使用选项#2,但限制(我认为

我正在测试一个Spring启动应用程序,并尝试使用Testcontainers在Docker容器中启动一个临时数据库,以进行JUnit 5测试。有:

  • 通过在测试类中定义容器,添加至少两个注释,以及(在Spring引导测试中)用几行代码覆盖应用程序上下文,将其指向新数据库。对于每个测试类,这是相当多的额外代码行

  • 通过将
    spring.datasource.url
    属性设置为经过特殊修改的url。最优雅的方法,尽管可以说是一个缺点,是这使得测试对正在发生的事情不那么明确

  • 我想使用选项#2,但限制(我认为)是它要求您使用PostgreSQL(或任何数据库)的标准(空)“库”映像。我有一个自定义数据库映像,它有自己的Dockerfile。特别是,此映像包含许多初始化脚本(而不仅仅是一个)来构建数据库模式

    有没有办法将Testcontainers的JDBC URL配置与自定义Postgres映像一起使用?我更愿意将其指向Docker文件,让Testcontainers动态生成映像,但我也可以接受一种解决方案,即预构建数据库映像,并告诉Testcontainers从Docker Hub中提取映像


    作为参考,我的代码位于Github上,所涉及的Dockerfile位于“database”目录中。一个示例测试用例是,您可以看到,如果我使用JDBCURL方法,至少有15行代码可以消除。

    您的问题有不同的解决方案。我认为一个很好的解决方案是设置一个
    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 \
        ${granite_image_name}:${the_tag} \
        --spring.datasource.url=$test_db_url
    
    您现在应该能够简单地定义容器中的变量。e、 g

    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容器,如下所示:

    spring.datasource.url = ${DB_HOST}:${DB_PORT}/"nameofDB"
    spring.datasource.username = ${DB_USERNAME}
    spring.datasource.password = ${DB_PASSWORD}
    
    docker run \
        -it my_project_name \
        ${granite_image_name}:${the_tag} \
        --spring.datasource.url=$test_db_url
    
    甚至定义一组外部化配置:

    您能否提供Dockerfile或告诉我们您使用的基本图像?您是否使用docker compose文件来执行此操作?@Stefano我在Github上添加了一些指向代码和Dockerfile的链接