Micronaut+Testcontainers测试时启动多个PostgreSQL容器问题排查
问题原因分析
核心冲突在于**jdbc:tc:postgresql驱动的特性**与你手动通过docker-compose启动PostgreSQL容器的配置重复:
jdbc:tc:postgresql是Testcontainers提供的特殊JDBC驱动,本质作用就是自动启动一个独立的PostgreSQL容器,并自动生成连接参数(随机端口、默认库等)- 你同时通过docker-compose启动了另一个PostgreSQL容器,导致测试环境中存在两个完全独立的PostgreSQL实例:Flyway通过
tc驱动连接自己启动的实例执行迁移,而应用本身连接docker-compose启动的实例,两者数据完全隔离,自然读不到Flyway初始化的数据
排查与解决方案
方案1:移除docker-compose中的PostgreSQL,完全依赖Testcontainers的tc驱动
这是更符合Testcontainers最佳实践的方式,减少手动配置成本:
- 删除docker-compose.yml中PostgreSQL相关的服务配置
- 保留
application-test.yml中的jdbc:tc:postgresql驱动配置,Testcontainers会自动处理容器启动、Flyway迁移,应用也会连接同一个实例 - 若需要保留mockyeah的docker-compose配置,可以单独拆分配置文件,或者用Testcontainers的
DockerComposeContainer来管理mockyeah服务
方案2:禁用tc驱动的自动容器启动,连接到docker-compose的PostgreSQL
如果必须保留docker-compose的PostgreSQL,需要修改JDBC配置,让Flyway和应用连接到同一个已启动的容器:
- 将
application-test.yml中的JDBC URL从jdbc:tc:postgresql:...改为标准PostgreSQL JDBC格式,示例:datasources: default: url: jdbc:postgresql://localhost:5432/your_test_db driverClassName: org.postgresql.Driver username: test_user password: test_pass flyway: datasources: default: url: jdbc:postgresql://localhost:5432/your_test_db driverClassName: org.postgresql.Driver # 其他Flyway配置(如迁移脚本路径等) - 确保docker-compose中的PostgreSQL容器暴露固定端口(如5432),且在测试启动前完全就绪
- 可以用Testcontainers的
DockerComposeContainer来管理docker-compose服务,确保容器启动完成后再执行Flyway迁移和测试
额外排查点
- 检查是否存在多份测试配置或测试类,重复定义了数据源,导致部分组件使用tc驱动、部分使用docker-compose的连接
- 确认Flyway的数据源配置与应用的数据源配置完全一致,避免Flyway单独使用tc驱动而应用连接另一个实例
内容的提问来源于stack exchange,提问作者user3379502
相关产品推荐
相关产品推荐

