Testcontainers DockerComposeContainer 与 Docker Compose 版本 v2.0.0

Posted

技术标签:

【中文标题】Testcontainers DockerComposeContainer 与 Docker Compose 版本 v2.0.0【英文标题】:Testcontainers DockerComposeContainer with Docker Compose version v2.0.0 【发布时间】:2021-11-29 00:42:23 【问题描述】:

我正在尝试使用带有DockerComposeContainer 的测试容器。我的 docker-compose.yaml 内容是这样的:

version: '3.8'

services:
  postgresql:
    image: postgres:13
    environment:
      POSTGRES_USER: ordering
      POSTGRES_PASSWORD: ordering
      POSTGRES_DB: ordering

我正在使用以下 spring-boot 初始化代码声明容器:

  static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) 
      DockerComposeContainer<?> environment = new DockerComposeContainer<>(DOCKER_COMPOSE_FILE)
          .withExposedService(DB_SERVICE_NAME, DB_PORT)
          .withLocalCompose(true)
          .start();

这在最近更新了 MacOS 上的 docker-desktop 之前一直有效。

现在它抛出以下错误:

Caused by: org.testcontainers.containers.ContainerLaunchException: Aborting attempt to link to container l2whc7cxqkzd_postgresql_1 as it is not running
    at org.testcontainers.containers.GenericContainer.applyConfiguration(GenericContainer.java:812)
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:363)
    ... 40 more

如果我在代码抛出异常之前在代码中放置一个断点并检查我正在运行的 docker 容器,我会看到一个名为 l2whc7cxqkzd-postgresql-1 的容器。不同之处在于名称中使用破折号而不是下划线。我猜这是 docker-compose 行为在项目标识符分隔符方面的最新变化。

我的问题是,有没有办法在 Docker Compose 2.0.0 中使用测试容器?

我的 testcontainers 依赖版本是 1.16.0 和 docker 桌面版本 4.1.0。

【问题讨论】:

【参考方案1】:

似乎可行的一种解决方法是将compatibility 选项传递给 docker compose 命令。喜欢:

static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) 
      DockerComposeContainer<?> environment = new DockerComposeContainer<>(DOCKER_COMPOSE_FILE)
          .withOptions("--compatibility")
          .withExposedService(DB_SERVICE_NAME, DB_PORT)
          .start();
   


【讨论】:

以上是关于Testcontainers DockerComposeContainer 与 Docker Compose 版本 v2.0.0的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Testcontainers 发送信号?

如何在多个 SpringBootTests 之间重用 Testcontainers?

使用 testcontainers 测试 kafka 和 spark

如何将 Testcontainers 与 @DataJpaTest 结合使用以避免代码重复?

Dockerfile testcontainers 无法连接到 Ryuk

SpringBootTest、Testcontainers、容器启动——映射端口只能在容器启动后获取