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

Posted

技术标签:

【中文标题】TestContainers 中的 KafkaContainer 挂起直到超时,并显示“等待容器端口打开超时”【英文标题】:The KafkaContainer in TestContainers hangs till timeout with "Timed out waiting for container port to open" 【发布时间】:2021-02-05 15:03:03 【问题描述】:

我正在尝试在 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>

【问题讨论】:

【参考方案1】:

从我在源代码中看到的waitingFor(Wait.forListeningPort()) 仅在您之前公开了一些端口时才有效。 (不过我不是 100% 确定。)

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

【讨论】:

以上是关于TestContainers 中的 KafkaContainer 挂起直到超时,并显示“等待容器端口打开超时”的主要内容,如果未能解决你的问题,请参考以下文章

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

在 JUnit5 中使用 Testcontainers 和 gradle 时无法解析 'DockerImageName' 中的方法 'parse'

stderr 和 stdout 被 testcontainers-java 中的换行符随机中断

尝试将 Testcontainers 规则与抽象类中的网络一起使用时出现“没有这样的网络”错误

在 springboot + Testcontainers 中执行特定的 SQL 填充数据库

使用 Testcontainers 和 Liquibase 时在测试之间重置数据库