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
相关产品推荐
相关产品推荐

