diff --git a/src/Testcontainers.Kafka/ApacheConfiguration.cs b/src/Testcontainers.Kafka/ApacheConfiguration.cs
index 3e8d68868..de4629c20 100644
--- a/src/Testcontainers.Kafka/ApacheConfiguration.cs
+++ b/src/Testcontainers.Kafka/ApacheConfiguration.cs
@@ -50,12 +50,15 @@ public void Validate(KafkaConfiguration resourceConfiguration)
///
public string CreateStartupScript(KafkaConfiguration resourceConfiguration, KafkaContainer container)
{
- var additionalAdvertisedListeners = string.Join(",", container.AdvertisedListeners ?? Array.Empty());
+ var advertisedListeners = new List();
+ advertisedListeners.Add("PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort));
+ advertisedListeners.Add("BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort);
+ advertisedListeners.AddRange(container.AdvertisedListeners ?? Array.Empty());
var startupScript = new StringWriter();
startupScript.NewLine = "\n";
startupScript.WriteLine("#!/bin/bash");
- startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort) + ",BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort + "," + additionalAdvertisedListeners);
+ startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=" + string.Join(",", advertisedListeners));
startupScript.WriteLine("exec /etc/kafka/docker/run");
return startupScript.ToString();
}
diff --git a/src/Testcontainers.Kafka/ConfluentConfiguration.cs b/src/Testcontainers.Kafka/ConfluentConfiguration.cs
index f2e584710..27c63f98c 100644
--- a/src/Testcontainers.Kafka/ConfluentConfiguration.cs
+++ b/src/Testcontainers.Kafka/ConfluentConfiguration.cs
@@ -49,7 +49,10 @@ public void Validate(KafkaConfiguration resourceConfiguration)
///
public string CreateStartupScript(KafkaConfiguration resourceConfiguration, KafkaContainer container)
{
- var additionalAdvertisedListeners = string.Join(",", container.AdvertisedListeners ?? Array.Empty());
+ var advertisedListeners = new List();
+ advertisedListeners.Add("PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort));
+ advertisedListeners.Add("BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort);
+ advertisedListeners.AddRange(container.AdvertisedListeners ?? Array.Empty());
var isZooKeeperConsensus = resourceConfiguration.ConsensusProtocol == ConsensusProtocol.ZooKeeper;
@@ -68,7 +71,7 @@ public string CreateStartupScript(KafkaConfiguration resourceConfiguration, Kafk
startupScript.WriteLine("zookeeper-server-start zookeeper.properties &");
}
- startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort) + ",BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort + "," + additionalAdvertisedListeners);
+ startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=" + string.Join(",", advertisedListeners));
startupScript.WriteLine("exec /etc/confluent/docker/run");
return startupScript.ToString();
}
diff --git a/tests/Testcontainers.Kafka.Tests/Dockerfile b/tests/Testcontainers.Kafka.Tests/Dockerfile
index 78378f63b..a62f8f15c 100644
--- a/tests/Testcontainers.Kafka.Tests/Dockerfile
+++ b/tests/Testcontainers.Kafka.Tests/Dockerfile
@@ -1,3 +1,4 @@
FROM confluentinc/cp-kafka:7.5.12@sha256:997883c60e6f1207fb5f779c7a8fdae57312a17f446fd5ea3eb8b73f52d4a1cf
+FROM confluentinc/cp-kafka:8.2.4@sha256:58e544adba6a825389ab56dad5f8a1c72d9bbcdcf077e275473f1aff22e2cd76 AS confluent-v8_2_4
FROM apache/kafka:4.1.1@sha256:0bc1bb2478f45b6cea78864df86acdc11e8df2c5172477819a4d12942cbe5d40 AS apache-v4_1_1
FROM apache/kafka-native:4.1.1@sha256:b8faca36f5385f90e46861ea0b2f532ebed86e9b2868b717c75a67f6fda0c7ce AS apache-native-v4_1_1
\ No newline at end of file
diff --git a/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs b/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs
index a46d07da6..b1ce060f3 100644
--- a/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs
+++ b/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs
@@ -96,6 +96,20 @@ public KafkaZooKeeperConfiguration()
}
}
+ // Confluent Platform 8.x runs on Kafka 4.x, which rejects empty elements in
+ // `advertised.listeners`. A trailing comma made the container exit on startup:
+ // https://github.com/testcontainers/testcontainers-dotnet/issues/1771.
+ [UsedImplicitly]
+ public sealed class ConfluentKafkaV8Configuration : KafkaContainerTest
+ {
+ public ConfluentKafkaV8Configuration()
+ : base(new KafkaBuilder(TestSession.GetImageFromDockerfile(stage: "confluent-v8_2_4"))
+ .WithKRaft()
+ .Build())
+ {
+ }
+ }
+
[UsedImplicitly]
public sealed class ApacheKafkaConfiguration : KafkaContainerTest
{