You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:05:10