From 9ad00e921d9a2c9fdb6f666bc282d755923a263b Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Tue, 13 Oct 2026 18:25:18 +0100 Subject: [PATCH 1/2] Fix Kafka container starting before the broker is ready After the starter script is copied, the second wait fell back to the placeholder "Waiting for script..." log wait whenever no wait strategy was configured, so start() resolved before Kafka was listening. Restore the configured wait strategy before selecting the second wait. --- packages/modules/kafka/src/kafka-container-latest.test.ts | 8 ++++++++ packages/modules/kafka/src/kafka-container.ts | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/modules/kafka/src/kafka-container-latest.test.ts b/packages/modules/kafka/src/kafka-container-latest.test.ts index 0207bb695..b8b4294c3 100644 --- a/packages/modules/kafka/src/kafka-container-latest.test.ts +++ b/packages/modules/kafka/src/kafka-container-latest.test.ts @@ -18,6 +18,14 @@ describe("KafkaContainer", { timeout: 240_000 }, () => { // } }); + it("should be listening when started", async () => { + await using container = await new KafkaContainer(IMAGE).start(); + + const { exitCode } = await container.exec(["bash", "-c", " { await using network = await new Network().start(); await using container = await new KafkaContainer(IMAGE).withNetwork(network).start(); diff --git a/packages/modules/kafka/src/kafka-container.ts b/packages/modules/kafka/src/kafka-container.ts index 5c6ff485f..67c937321 100644 --- a/packages/modules/kafka/src/kafka-container.ts +++ b/packages/modules/kafka/src/kafka-container.ts @@ -193,7 +193,8 @@ export class KafkaContainer extends GenericContainer { const boundPorts = BoundPorts.fromInspectResult(client.info.containerRuntime.hostIps, inspectResult).filter( this.exposedPorts ); - const waitStrategy = await this.selectWaitStrategy(client, dockerInspectResult, this.originalWaitStrategy); + this.waitStrategy = this.originalWaitStrategy; + const waitStrategy = await this.selectWaitStrategy(client, dockerInspectResult); if (this.startupTimeoutMs !== undefined) { waitStrategy.withStartupTimeout(this.startupTimeoutMs); } From 54d3ccf5fa1d16bca08c462eaaaf3de6baa54e29 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Tue, 13 Oct 2026 18:30:41 +0100 Subject: [PATCH 2/2] Remove the wait strategy argument from selectWaitStrategy An explicit undefined fell back to this.waitStrategy, so the argument could not express "no strategy configured". Kafka and Redpanda now restore the configured strategy and call it with two arguments. --- packages/modules/redpanda/src/redpanda-container.ts | 3 ++- .../src/generic-container/generic-container.ts | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/modules/redpanda/src/redpanda-container.ts b/packages/modules/redpanda/src/redpanda-container.ts index 60a950498..28bdf20ee 100644 --- a/packages/modules/redpanda/src/redpanda-container.ts +++ b/packages/modules/redpanda/src/redpanda-container.ts @@ -79,7 +79,8 @@ export class RedpandaContainer extends GenericContainer { const boundPorts = BoundPorts.fromInspectResult(client.info.containerRuntime.hostIps, inspectResult).filter( this.exposedPorts ); - const waitStrategy = await this.selectWaitStrategy(client, dockerInspectResult, this.originalWaitStrategy); + this.waitStrategy = this.originalWaitStrategy; + const waitStrategy = await this.selectWaitStrategy(client, dockerInspectResult); if (this.startupTimeoutMs !== undefined) { waitStrategy.withStartupTimeout(this.startupTimeoutMs); } diff --git a/packages/testcontainers/src/generic-container/generic-container.ts b/packages/testcontainers/src/generic-container/generic-container.ts index c38bcac44..daa4a6357 100644 --- a/packages/testcontainers/src/generic-container/generic-container.ts +++ b/packages/testcontainers/src/generic-container/generic-container.ts @@ -134,13 +134,12 @@ export class GenericContainer implements TestContainer { protected async selectWaitStrategy( client: ContainerRuntimeClient, - inspectResult: ContainerInspectInfo, - waitStrategy: WaitStrategy | undefined = this.waitStrategy + inspectResult: ContainerInspectInfo ): Promise { return selectWaitStrategy({ client, inspectResult, - waitStrategy, + waitStrategy: this.waitStrategy, healthCheck: this.healthCheck, imageNames: [this.imageName.string], });