使用docker compose运行Testcontainers时的静态容器名称

使用docker compose运行Testcontainers时的静态容器名称,docker,docker-compose,testcontainers,Docker,Docker Compose,Testcontainers,我的应用程序由一个Spring启动应用程序和一个数据库组成。我可以使用Docker compose在Docker中成功运行它们。我现在想使用类似的Docker compose文件和testcontainers来编写一些自动化测试。我失败了,因为Spring Boot应用程序的application.yml文件中的主机名与分配给数据库容器的随机名称不匹配,因此该应用程序无法连接到数据库 docker compose 类规则设置 测试运行时,将为容器分配名称,例如: Wtdopq2hnev_api_

我的应用程序由一个Spring启动应用程序和一个数据库组成。我可以使用Docker compose在Docker中成功运行它们。我现在想使用类似的Docker compose文件和testcontainers来编写一些自动化测试。我失败了,因为Spring Boot应用程序的application.yml文件中的主机名与分配给数据库容器的随机名称不匹配,因此该应用程序无法连接到数据库

docker compose 类规则设置 测试运行时,将为容器分配名称,例如:

Wtdopq2hnev_api_1 Wtdopq2hnev_api-db_1

事实上,它似乎是在分配一个随机网络名(wtdopq2hnev),而不是使用my_网络,这最终是我的问题

我可以在docker-compose.yml文件中指定容器的名称,但是我不能“公开”我需要能够提供的服务,以便从测试中调用API:

我是不是走错了路

  • Java版本:1.8.0_144
  • Testcontainers版本:1.8.3
  • Mac版Docker:17.09.0-ce-mac35(19611)

Docker版本有点旧,但我认为这不是问题所在

只需设置一个容器名称,您就会知道:

services:
  redis:
    image: redis:alpine
    container_name: whatever-you-fancy

容器名称在这里不重要,重要的是主机名,在您的例子中,这将是
api
api db
。对于这个简单的用例,可能不需要自定义网络,您是否在没有自定义网络的情况下尝试过它?

是的,我在问题中提到,我可以这样做来解决数据库连接问题,但是我如何“公开”数据库?我想做灰盒测试,所以我想能够查询数据库。我已经描述了一个简单的示例,但在现实世界中,有更多的服务需要相互连接,但同时我希望从测试中连接到它们,使用testcontainers时设置容器名称会导致错误。
@ClassRule public static DockerComposeContainer<?> dockerEnvironment =
        new DockerComposeContainer<>(new File("docker-compose.yml"))
                .withPull(false)
                .withLocalCompose(true)
                .withExposedService("api", "8080");
spring:
  profiles: docker
  datasource:
    url: jdbc:postgresql://api-db:5432/api
services:
  redis:
    image: redis:alpine
    container_name: whatever-you-fancy