首页 > 解决方案 > Testcontainers DockerComposeContainer 与 Docker Compose 版本 v2.0.0

问题描述

我正在尝试使用带有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 容器,我会看到一个名为 name 的容器l2whc7cxqkzd-postgresql-1。不同之处在于名称中使用破折号而不是下划线。我猜这是最近关于项目标识符分隔符的 docker-compose 行为的变化。

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

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

标签: docker-composespring-boot-testtestcontainers

解决方案


一种似乎可行的解决方法是将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();
   }
}


推荐阅读