当使用Docker Compose运行Testcontainers时,静态容器名称是什么?

3

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

docker-compose

version: '2'

services:
  api:
    image: simon/api:1.0.0-SNAPSHOT
    networks:
      - my_network

  api-db:
    image: simon/api-db:1.0.0-SNAPSHOT
    networks:
      - my_network

  networks:
    my_network:
      external: false

课程规则设置

@ClassRule public static DockerComposeContainer<?> dockerEnvironment =
        new DockerComposeContainer<>(new File("docker-compose.yml"))
                .withPull(false)
                .withLocalCompose(true)
                .withExposedService("api", "8080");

application.yml

spring:
  profiles: docker
  datasource:
    url: jdbc:postgresql://api-db:5432/api

当测试运行时,容器会被分配名称,例如:
wtdopq2hneev_api_1 wtdopq2hneev_api-db_1
似乎它分配了一个随机的网络名称(wtdopq2hneev),而不是使用my_network,这最终是我的问题。
我可以在docker-compose.yml文件中指定容器的名称,但是那样我就无法"暴露"所需的服务,以便我可以从我的测试中调用我的API:
我做错了吗?
Java版本:1.8.0_144 Testcontainers版本:1.8.3 Docker for Mac版本:17.09.0-ce-mac35(19611)
Docker版本有点旧,但我认为这不是问题。
2个回答

1

容器名称在这里并不重要,重要的是主机名,在你的情况下这将是apiapi-db。对于这个简单的用例,可能没有必要使用自定义网络,你尝试过没有使用它吗?


-1

只需设置容器名称,您就会知道它是什么:

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

是的,我在我的问题中提到了我可以这样做来解决数据库连接问题,但是我如何“暴露”数据库呢?我想进行灰盒测试,因此我希望能够查询数据库。我描述了一个简单的例子,但在现实世界中,有更多需要相互连接的服务,但同时我也希望能够从我的测试中连接到它们。 - s1mm0t
5
在使用 testcontainers 时设置 container_name 会导致错误。 - Johannes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接