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

Testcontainers DockerComposeContainer与Docker Compose v2.0.0兼容问题咨询

解决Testcontainers 1.16.0与Docker Compose v2.0.0(Docker Desktop 4.1.0)的容器名称匹配问题

你猜的完全没错!这个问题确实是Docker Compose v2的核心变更导致的——Compose v2把项目标识符和服务名称之间的分隔符从下划线(_)改成了短横线(-),而Testcontainers 1.16.0还没适配这个变化,所以它会按照旧规则去找带下划线的容器名,自然找不到实际运行的、用短横线分隔的容器。

下面给你几个可行的解决办法,按推荐优先级排序:

1. 升级Testcontainers到适配Compose v2的版本

Testcontainers从1.17.0版本开始正式支持Docker Compose v2,这是最彻底的长期解决方案。升级后,Testcontainers会自动识别Compose版本并处理容器名称的分隔符差异,你不需要修改任何现有代码,直接就能正常运行。

2. 回退Docker Compose到v1模式

如果暂时没法升级Testcontainers,你可以简单切换回Compose v1:

  • 打开Docker Desktop,进入「Settings -> General」,取消勾选「Use Docker Compose V2」选项,重启Docker后生效;
  • 或者在测试代码启动前,设置系统属性强制Testcontainers使用旧版docker-compose命令:
    static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            System.setProperty("testcontainers.docker.compose.command", "docker-compose");
            DockerComposeContainer<?> environment = new DockerComposeContainer<>(DOCKER_COMPOSE_FILE)
                    .withExposedService(DB_SERVICE_NAME, DB_PORT)
                    .withLocalCompose(true)
                    .start();
        }
    }
    

3. 手动指定容器名称(临时 workaround)

如果上面两种方案都没法用,你可以在docker-compose.yaml里给服务显式指定固定容器名,绕开自动生成的名称问题:

version: '3.8'
services:
  postgresql:
    image: postgres:13
    container_name: postgresql_test # 固定容器名称
    environment:
      POSTGRES_USER: ordering
      POSTGRES_PASSWORD: ordering
      POSTGRES_DB: ordering

然后在Testcontainers代码里,把withExposedService的第一个参数改成你指定的容器名:

.withExposedService("postgresql_test", DB_PORT)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:07:40