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

Spring Boot中Testcontainers结合ComposeContainer与R2DBC Postgres报错排查

问题排查与解决方案

核心原因分析

  1. 固定容器名冲突:主compose.yml中设置的container_name: my-db会被Docker Compose自动添加前缀(如日志中的gicdzpqgd9bm-my-db-1),导致Testcontainers无法匹配到实际运行的容器,进而引发socat链接失败。
  2. 权限配置干扰:userns_mode: keep-id是Bitnami镜像的权限映射配置,在Testcontainers环境下可能导致容器初始化异常,使得Postgres服务看似启动但未真正就绪。
  3. 等待策略不足:仅监听端口无法确保Postgres完成启动流程,需要等待服务输出就绪日志。

具体解决步骤

1. 移除固定容器名

修改主compose.yml,删除container_name: my-db配置,让Testcontainers自动管理唯一容器名:

services:
  my-db:
    userns_mode: keep-id:uid=1001,gid=1001
    image: bitnami/postgresql:16.3.0
    env_file: .env
    ports:
      - "5432:5432"
    networks:
      - my-net

networks:
  my-net:

2. 调整权限配置

在测试用compose.yml中覆盖userns_mode配置,避免权限映射干扰容器初始化:

services:
  my-db:
    extends:
      file: ../../../compose.yml
      service: my-db
    env_file: .env
    userns_mode: ""  # 移除该权限配置
networks:
  my-net:

3. 增强容器等待策略

修改测试类,添加日志等待逻辑,确保Postgres完全就绪后再进行后续操作:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
@ActiveProfiles("test")
class ApiApplicationTests {
    @Container
    public static ComposeContainer environment = new ComposeContainer(
            new File("src/test/resources/compose.yml"))
            .withExposedService("my-db", 5432, 
                Wait.forListeningPort()
                    .and(Wait.forLogMessage(".*database system is ready to accept connections.*", 1))
                    .withStartupTimeout(Duration.ofMinutes(2)))
            .withLocalCompose(true);

    @Test
    void contextLoads() {
        assertTrue(true);
    }
}

4. 验证测试环境配置

确保src/test/resources/.env包含Postgres启动必需的环境变量:

POSTGRES_USER=test_user
POSTGRES_PASSWORD=test_pass
POSTGRES_DB=test_db

5. 检查Docker Compose版本

使用withLocalCompose(true)会调用本地Docker Compose命令,确保本地版本为2.x以上(通过docker compose version查看),避免版本兼容问题。


内容的提问来源于stack exchange,提问作者anotherOneHere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:30:18