测试容器 DockerComposeContainer 与 Docker Compose 版本 v2.0.0

Mus*_*afa 2 docker-compose spring-boot-test testcontainers

我正在尝试将 testcontainers 与DockerComposeContainer. 我的 docker-compose.yaml 内容是这样的:

version: '3.8'

services:
  postgresql:
    image: postgres:13
    environment:
      POSTGRES_USER: ordering
      POSTGRES_PASSWORD: ordering
      POSTGRES_DB: ordering
Run Code Online (Sandbox Code Playgroud)

我使用以下 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();
}
Run Code Online (Sandbox Code Playgroud)

这曾经一直有效,直到最近 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
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,有没有办法将 testcontainers 与 Docker Compose 2.0.0 一起使用?

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

Mus*_*afa 5

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

Run Code Online (Sandbox Code Playgroud)