TestContainers中的KafkaContainer挂起,直到超时为止,并显示“超时等待容器端口打开”

问题描述

我正在尝试在TestContainers中启动kafka容器。 我的代码如下所示:

import java.io.File;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.DockerComposeContainer;
import org.testcontainers.containers.KafkaContainer;
import org.testcontainers.containers.PostgresqlContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class FirstTest {

  @Container
  public static DockerComposeContainer environment =
      new DockerComposeContainer(new File("src/test/resources/compose-test.yml"))
          .withExposedService(
              "redis_1",6379,Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(60)));

  @Container
  public static KafkaContainer kafka =
      new KafkaContainer()
          .waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(360)));

  @Container public PostgresqlContainer postgresContainer = new PostgresqlContainer();

  @Test
  void integrationtest() {

    String redisUrl =
        environment.getServiceHost("redis_1",6379)
            + ":"
            + environment.getServicePort("redis_1",6379);

    String jdbcUrl = postgresContainer.getJdbcUrl();
    String username = postgresContainer.getUsername();
    String password = postgresContainer.getpassword();

    String url = kafka.getBootstrapServers();
  }
}

运行此代码时,线程会挂起运行状态,直到收到超时异常:

Caused by: org.testcontainers.containers.ContainerLaunchException: Timed out waiting for container port to open (localhost ports: [32937,32939] should be listening)

我要提到的是,如果没有kafkaContainer,一切都会按预期进行。我能够成功启动redis和postgres容器。

这是我使用的kafkaContainer版本:

<dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>kafka</artifactId>
      <version>1.14.3</version>
      <scope>test</scope>
 </dependency>

解决方法

根据我在源代码waitingFor(Wait.forListeningPort())中看到的内容,只有在您先前公开了某些端口的情况下,它才起作用。 (不过,我不确定100%。)

如果仅创建一个没有waitingFor()调用的Kafka容器怎么办?