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

Posted

技术标签:

【中文标题】使用 docker compose 运行 Testcontainers 时的静态容器名称【英文标题】:Static container name when running Testcontainers with docker compose 【发布时间】:2019-01-17 07:01:12 【问题描述】:

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

码头工人撰写

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 测试容器版本:1.8.3 Docker for Mac 版本:17.09.0-ce-mac35 (19611)

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

只要设置一个容器名就知道了:

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

【讨论】:

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

以上是关于使用 docker compose 运行 Testcontainers 时的静态容器名称的主要内容,如果未能解决你的问题,请参考以下文章

Windows 10 docker-compose 自动化构建lnmp

错误:Compose 文件“./docker-compose.yaml”无效,因为:services.nvidia-smi-test 的配置选项不受支持:“runtime”

用于 pentaho 数据集成 (pdi) 的 docker-compose 健康检查

使用docker-compose简化docker run 运行参数

使用 docker 运行多个项目,每个项目都使用 docker-compose 运行

使用 docker-compose 在 Docker 中运行 laravel/lumen