This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 77771a22a0a Use a fixed port (default one) when running services via 
camel infra (#18344)
77771a22a0a is described below

commit 77771a22a0a64a1777cad939837565fd8b7097df
Author: Federico Mariani <[email protected]>
AuthorDate: Thu Jun 12 07:09:25 2025 +0200

    Use a fixed port (default one) when running services via camel infra 
(#18344)
---
 .../core/commands/infra/InfraBaseCommand.java      |  1 +
 .../artemis/services/ArtemisAllInfraService.java   |  2 +-
 .../infra/artemis/services/ArtemisContainer.java   | 10 ++++++
 .../test/infra/aws2/services/AWSContainer.java     | 17 ++++++----
 .../services/AWSLocalContainerInfraService.java    |  3 +-
 .../common/services/AzureStorageInfraService.java  |  3 +-
 .../azure/common/services/AzuriteContainer.java    | 12 +++++--
 .../common/services/ContainerEnvironmentUtil.java  | 10 ++++++
 .../CouchDbLocalContainerInfraService.java         | 20 +++++++++---
 .../ElasticSearchLocalContainerInfraService.java   | 31 +++++++++++-------
 .../services/FhirLocalContainerInfraService.java   | 31 ++++++++++++------
 .../GooglePubSubLocalContainerInfraService.java    | 15 ++++++++-
 .../HashicorpVaultLocalContainerInfraService.java  | 27 ++++++++++++----
 .../LocalHiveMQSparkplugTCKInfraService.java       | 17 ++++++++--
 .../InfinispanLocalContainerInfraService.java      | 37 ++++++++++++++--------
 .../services/ContainerLocalKafkaInfraService.java  | 14 ++++++--
 .../MicroprofileLRALocalContainerInfraService.java | 23 +++++++++++---
 .../services/MilvusLocalContainerInfraService.java | 16 ++++++++--
 .../services/MinioLocalContainerInfraService.java  | 33 +++++++++++++------
 .../MongoDBLocalContainerInfraService.java         | 27 ++++++++++++++--
 .../MosquittoLocalContainerInfraService.java       |  7 +++-
 .../services/NatsLocalContainerInfraService.java   | 21 +++++++++---
 .../services/Neo4jLocalContainerInfraService.java  | 20 ++++++++++--
 .../services/OllamaLocalContainerInfraService.java | 14 ++++++--
 .../infra/openldap/services/OpenLdapContainer.java | 11 +++++--
 .../OpenldapLocalContainerInfraService.java        |  3 +-
 .../OpenSearchLocalContainerInfraService.java      | 35 ++++++++++++--------
 .../pinecone/services/PineconeIndexContainer.java  | 10 ++++--
 .../PineconeLocalContainerInfraService.java        | 18 +++++++++--
 .../PostgresLocalContainerInfraService.java        | 15 +++++++--
 .../services/PulsarLocalContainerInfraService.java | 18 +++++++++--
 .../services/QdrantLocalContainerInfraService.java | 19 ++++++++++-
 .../RabbitMQLocalContainerInfraService.java        | 16 +++++++++-
 .../test/infra/redis/services/RedisContainer.java  | 15 ++++++++-
 .../services/RedisLocalContainerInfraService.java  |  4 ++-
 .../rocketmq/services/RocketMQBrokerContainer.java | 16 +++++++---
 .../services/RocketMQContainerInfraService.java    |  4 ++-
 .../test/infra/smb/services/SmbContainer.java      | 11 +++++--
 .../services/SmbLocalContainerInfraService.java    |  3 +-
 .../test/infra/solr/services/SolrContainer.java    | 13 ++++++--
 .../services/SolrLocalContainerInfraService.java   |  4 ++-
 .../TorchServeLocalContainerInfraService.java      | 31 +++++++++++++-----
 .../WeaviateLocalContainerInfraService.java        | 18 +++++++++--
 .../services/XmppLocalContainerInfraService.java   |  3 +-
 .../infra/xmpp/services/XmppServerContainer.java   |  8 +++++
 45 files changed, 535 insertions(+), 151 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
index 00ae26c0b97..2d19b99579f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
@@ -60,6 +60,7 @@ public abstract class InfraBaseCommand extends CamelCommand {
         jsonMapper.enable(SerializationFeature.INDENT_OUTPUT);
         jsonMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, 
true);
         jsonMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, 
true);
+        
jsonMapper.configure(MapperFeature.REQUIRE_HANDLERS_FOR_JAVA8_OPTIONALS, false);
     }
 
     protected List<TestInfraService> getMetadata() throws IOException {
diff --git 
a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAllInfraService.java
 
b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAllInfraService.java
index 8b2d446ec13..ceb6ff9e06c 100644
--- 
a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAllInfraService.java
+++ 
b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisAllInfraService.java
@@ -35,7 +35,7 @@ public class ArtemisAllInfraService implements 
ArtemisInfraService, ContainerSer
     }
 
     protected ArtemisContainer initContainer() {
-        return new ArtemisContainer();
+        return ArtemisContainer.withFixedPort();
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisContainer.java
 
b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisContainer.java
index 599746800b7..624e45520e7 100644
--- 
a/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisContainer.java
+++ 
b/test-infra/camel-test-infra-artemis/src/main/java/org/apache/camel/test/infra/artemis/services/ArtemisContainer.java
@@ -43,6 +43,16 @@ public class ArtemisContainer extends 
GenericContainer<ArtemisContainer> impleme
                 .waitingFor(Wait.forListeningPort());
     }
 
+    public static ArtemisContainer withFixedPort() {
+        ArtemisContainer container = new ArtemisContainer();
+        container.addFixedExposedPort(DEFAULT_MQTT_PORT, DEFAULT_MQTT_PORT);
+        container.addFixedExposedPort(DEFAULT_AMQP_PORT, DEFAULT_AMQP_PORT);
+        container.addFixedExposedPort(DEFAULT_ADMIN_PORT, DEFAULT_ADMIN_PORT);
+        container.addFixedExposedPort(DEFAULT_ACCEPTOR_PORT, 
DEFAULT_ACCEPTOR_PORT);
+
+        return container;
+    }
+
     /**
      * Gets the port number used for exchanging messages using the AMQP 
protocol
      *
diff --git 
a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSContainer.java
 
b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSContainer.java
index 7056d136064..7d45e86b3c1 100644
--- 
a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSContainer.java
+++ 
b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSContainer.java
@@ -51,11 +51,11 @@ public class AWSContainer extends 
GenericContainer<AWSContainer> {
         super(imageName);
     }
 
-    public AWSContainer(String imageName, Service... services) {
+    public AWSContainer(String imageName, boolean fixedPort, Service... 
services) {
         super(imageName);
 
         setupServices(services);
-        setupContainer();
+        setupContainer(fixedPort);
     }
 
     @Deprecated
@@ -63,7 +63,7 @@ public class AWSContainer extends 
GenericContainer<AWSContainer> {
         super(imageName);
 
         setupServices(serviceList);
-        setupContainer();
+        setupContainer(false);
     }
 
     public void setupServices(Service... services) {
@@ -80,9 +80,14 @@ public class AWSContainer extends 
GenericContainer<AWSContainer> {
         withEnv("SERVICE", serviceList);
     }
 
-    protected void setupContainer() {
-        withExposedPorts(SERVICE_PORT)
-                .waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1));
+    protected void setupContainer(boolean fixedPort) {
+        if (fixedPort) {
+            addFixedExposedPort(SERVICE_PORT, SERVICE_PORT);
+        } else {
+            withExposedPorts(SERVICE_PORT);
+        }
+
+        waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1));
     }
 
     public AwsCredentialsProvider getCredentialsProvider() {
diff --git 
a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLocalContainerInfraService.java
index 6ea27cd88f5..9b5960917cf 100644
--- 
a/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-aws-v2/src/main/java/org/apache/camel/test/infra/aws2/services/AWSLocalContainerInfraService.java
@@ -49,7 +49,8 @@ public abstract class AWSLocalContainerInfraService 
implements AWSInfraService,
     }
 
     protected AWSContainer initContainer(String imageName, Service... 
services) {
-        return new AWSContainer(imageName, services);
+        boolean fixedPort = !this.getClass().getName().contains("TestService");
+        return new AWSContainer(imageName, fixedPort, services);
     }
 
     private String getAmazonHost() {
diff --git 
a/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzureStorageInfraService.java
 
b/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzureStorageInfraService.java
index 69c6dfac264..734c08a6711 100644
--- 
a/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzureStorageInfraService.java
+++ 
b/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzureStorageInfraService.java
@@ -20,6 +20,7 @@ package org.apache.camel.test.infra.azure.common.services;
 import org.apache.camel.test.infra.azure.common.AzureConfigs;
 import org.apache.camel.test.infra.azure.common.AzureProperties;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,7 +42,7 @@ public abstract class AzureStorageInfraService implements 
AzureInfraService, Con
     }
 
     protected AzuriteContainer initContainer(String imageName) {
-        return new AzuriteContainer(imageName);
+        return new AzuriteContainer(imageName, 
ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     public AzuriteContainer getContainer() {
diff --git 
a/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzuriteContainer.java
 
b/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzuriteContainer.java
index 8d77160e3e6..db835b84d1e 100644
--- 
a/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzuriteContainer.java
+++ 
b/test-infra/camel-test-infra-azure-common/src/main/java/org/apache/camel/test/infra/azure/common/services/AzuriteContainer.java
@@ -34,11 +34,17 @@ public class AzuriteContainer extends 
GenericContainer<AzuriteContainer> {
                 AzureProperties.AZURE_CONTAINER);
     }
 
-    public AzuriteContainer(String containerName) {
+    public AzuriteContainer(String containerName, boolean fixedPort) {
         super(containerName);
 
-        withExposedPorts(AzureServices.BLOB_SERVICE, 
AzureServices.QUEUE_SERVICE)
-                .waitingFor(Wait.forListeningPort());
+        if (fixedPort) {
+            addFixedExposedPort(AzureServices.BLOB_SERVICE, 
AzureServices.BLOB_SERVICE);
+            addFixedExposedPort(AzureServices.QUEUE_SERVICE, 
AzureServices.QUEUE_SERVICE);
+        } else {
+            withExposedPorts(AzureServices.BLOB_SERVICE, 
AzureServices.QUEUE_SERVICE);
+        }
+
+        waitingFor(Wait.forListeningPort());
     }
 
     public AzureCredentialsHolder azureCredentials() {
diff --git 
a/test-infra/camel-test-infra-common/src/main/java/org/apache/camel/test/infra/common/services/ContainerEnvironmentUtil.java
 
b/test-infra/camel-test-infra-common/src/main/java/org/apache/camel/test/infra/common/services/ContainerEnvironmentUtil.java
index dbe6c58c666..b5b79920c32 100644
--- 
a/test-infra/camel-test-infra-common/src/main/java/org/apache/camel/test/infra/common/services/ContainerEnvironmentUtil.java
+++ 
b/test-infra/camel-test-infra-common/src/main/java/org/apache/camel/test/infra/common/services/ContainerEnvironmentUtil.java
@@ -56,4 +56,14 @@ public final class ContainerEnvironmentUtil {
         int startupAttempts = Integer.valueOf(System.getProperty(property, 
String.valueOf(defaultValue)));
         container.setStartupAttempts(startupAttempts);
     }
+
+    public static boolean isFixedPort(Class cls) {
+        for (Class<?> i : cls.getInterfaces()) {
+            if (i.getName().contains("InfraService")) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
diff --git 
a/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
index d7c649a2b0a..fc0445a6b26 100644
--- 
a/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-couchdb/src/main/java/org/apache/camel/test/infra/couchdb/services/CouchDbLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.couchdb.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.couchdb.common.CouchDbProperties;
 import org.slf4j.Logger;
@@ -51,10 +52,21 @@ public class CouchDbLocalContainerInfraService implements 
CouchDbInfraService, C
     }
 
     protected GenericContainer initContainer(String imageName, String 
containerName) {
-        return new GenericContainer<>(DockerImageName.parse(imageName))
-                .withNetworkAliases(containerName)
-                .withExposedPorts(CouchDbProperties.DEFAULT_PORT)
-                .waitingFor(Wait.forListeningPort());
+        class CouchDBContainer extends GenericContainer<CouchDBContainer> {
+            public CouchDBContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName));
+                withNetworkAliases(containerName);
+                waitingFor(Wait.forListeningPort());
+
+                if (fixedPort) {
+                    addFixedExposedPort(CouchDbProperties.DEFAULT_PORT, 
CouchDbProperties.DEFAULT_PORT);
+                } else {
+                    withExposedPorts(CouchDbProperties.DEFAULT_PORT);
+                }
+            }
+        }
+
+        return new 
CouchDBContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
index b8b54a6bf3f..7c06c159579 100644
--- 
a/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-elasticsearch/src/main/java/org/apache/camel/test/infra/elasticsearch/services/ElasticSearchLocalContainerInfraService.java
@@ -65,18 +65,27 @@ public class ElasticSearchLocalContainerInfraService
     }
 
     protected ElasticsearchContainer initContainer(String imageName) {
-        DockerImageName customImage = DockerImageName.parse(imageName)
-                
.asCompatibleSubstituteFor("docker.elastic.co/elasticsearch/elasticsearch");
-        ElasticsearchContainer elasticsearchContainer = new 
ElasticsearchContainer(customImage)
-                .withPassword(PASSWORD);
-        // Increase the timeout from 60 seconds to 90 seconds to ensure that 
it will be long enough
-        // on the build pipeline
-        elasticsearchContainer.setWaitStrategy(
-                new LogMessageWaitStrategy()
-                        .withRegEx(".*(\"message\":\\s?\"started[\\s?|\"].*|] 
started\n$)")
-                        .withStartupTimeout(Duration.ofSeconds(90)));
-        return elasticsearchContainer;
+        class TestInfraElasticsearchContainer extends ElasticsearchContainer {
+            public TestInfraElasticsearchContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        
.asCompatibleSubstituteFor("docker.elastic.co/elasticsearch/elasticsearch"));
+
+                withPassword(PASSWORD);
+
+                if (fixedPort) {
+                    addFixedExposedPort(ELASTIC_SEARCH_PORT, 
ELASTIC_SEARCH_PORT);
+                } else {
+                    withExposedPorts(ELASTIC_SEARCH_PORT);
+                }
+
+                setWaitStrategy(
+                        new LogMessageWaitStrategy()
+                                
.withRegEx(".*(\"message\":\\s?\"started[\\s?|\"].*|] started\n$)")
+                                .withStartupTimeout(Duration.ofSeconds(90)));
+            }
+        }
 
+        return new 
TestInfraElasticsearchContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
index 3b895ffaa00..cc235f46fcd 100644
--- 
a/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-fhir/src/main/java/org/apache/camel/test/infra/fhir/services/FhirLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.fhir.common.FhirProperties;
 import org.slf4j.Logger;
@@ -53,16 +54,26 @@ public class FhirLocalContainerInfraService implements 
FhirInfraService, Contain
     }
 
     protected GenericContainer initContainer(String imageName, String 
containerName) {
-        return new GenericContainer(imageName)
-                .withNetworkAliases(containerName)
-                .withExposedPorts(FhirProperties.DEFAULT_SERVICE_PORT)
-                .withStartupTimeout(Duration.ofMinutes(3L))
-                .withStartupAttempts(5)
-                .withEnv("hapi.fhir.allow_multiple_delete", "true")
-                .withEnv("hapi.fhir.fhir_version", "R4")
-                .withEnv("hapi.fhir.reuse_cached_search_results_millis", "-1")
-                .waitingFor(Wait.forListeningPort())
-                
.waitingFor(Wait.forHttp("/fhir/metadata").withStartupTimeout(Duration.ofMinutes(3L)));
+        class FhirContainer extends GenericContainer<FhirContainer> {
+            public FhirContainer(boolean fixedPort) {
+                super(imageName);
+                withNetworkAliases(containerName);
+                if (fixedPort) {
+                    addFixedExposedPort(FhirProperties.DEFAULT_SERVICE_PORT, 
FhirProperties.DEFAULT_SERVICE_PORT);
+                } else {
+                    withExposedPorts(FhirProperties.DEFAULT_SERVICE_PORT);
+                }
+                withStartupTimeout(Duration.ofMinutes(3L));
+                withStartupAttempts(5);
+                withEnv("hapi.fhir.allow_multiple_delete", "true");
+                withEnv("hapi.fhir.fhir_version", "R4");
+                withEnv("hapi.fhir.reuse_cached_search_results_millis", "-1");
+                waitingFor(Wait.forListeningPort());
+                
waitingFor(Wait.forHttp("/fhir/metadata").withStartupTimeout(Duration.ofMinutes(3L)));
+            }
+        }
+
+        return new 
FhirContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
index f794fad90cd..9d51f4e8c03 100644
--- 
a/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-google-pubsub/src/main/java/org/apache/camel/test/infra/google/pubsub/services/GooglePubSubLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.google.pubsub.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.google.pubsub.common.GooglePubSubProperties;
 import org.slf4j.Logger;
@@ -35,6 +36,7 @@ public class GooglePubSubLocalContainerInfraService
     public static final String PROJECT_ID;
     private static final Logger LOG = 
LoggerFactory.getLogger(GooglePubSubLocalContainerInfraService.class);
     private static final String DEFAULT_PROJECT_ID = "test-project";
+    private static final int PORT = 8085;
 
     static {
         PROJECT_ID = System.getProperty(GooglePubSubProperties.PROJECT_ID, 
DEFAULT_PROJECT_ID);
@@ -57,7 +59,18 @@ public class GooglePubSubLocalContainerInfraService
     }
 
     protected PubSubEmulatorContainer initContainer(String imageName) {
-        return new PubSubEmulatorContainer(DockerImageName.parse(imageName));
+        class TestInfraPubSubEmulatorContainer extends PubSubEmulatorContainer 
{
+            public TestInfraPubSubEmulatorContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName));
+
+                if (fixedPort) {
+                    addFixedExposedPort(PORT, PORT);
+                } else {
+                    addExposedPort(PORT);
+                }
+            }
+        }
+        return new 
TestInfraPubSubEmulatorContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
index ad829a84669..e473b3ffc55 100644
--- 
a/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-hashicorp-vault/src/main/java/org/apache/camel/test/infra/hashicorp/vault/services/HashicorpVaultLocalContainerInfraService.java
@@ -36,6 +36,7 @@ import java.util.function.Consumer;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import 
org.apache.camel.test.infra.hashicorp.vault.common.HashicorpVaultProperties;
 import org.slf4j.Logger;
@@ -76,13 +77,25 @@ public class HashicorpVaultLocalContainerInfraService
         final Logger containerLog = LoggerFactory.getLogger("container." + 
containerName);
         final Consumer<OutputFrame> logConsumer = new 
Slf4jLogConsumer(containerLog);
 
-        return new GenericContainer<>(imageName)
-                .withNetworkAliases(containerName)
-                .withEnv("VAULT_DEV_ROOT_TOKEN_ID", DEFAULT_TOKEN)
-                .withLogConsumer(logConsumer)
-                
.withExposedPorts(HashicorpVaultProperties.DEFAULT_SERVICE_PORT)
-                .waitingFor(Wait.forListeningPort())
-                
.waitingFor(Wait.forLogMessage(".*Development.*mode.*should.*", 1));
+        class HashicorpVaultContainer extends 
GenericContainer<HashicorpVaultContainer> {
+            public HashicorpVaultContainer(boolean fixedPort) {
+                new GenericContainer<>(imageName)
+                        .withNetworkAliases(containerName)
+                        .withEnv("VAULT_DEV_ROOT_TOKEN_ID", DEFAULT_TOKEN)
+                        .withLogConsumer(logConsumer)
+                        .waitingFor(Wait.forListeningPort())
+                        
.waitingFor(Wait.forLogMessage(".*Development.*mode.*should.*", 1));
+
+                if (fixedPort) {
+                    
addFixedExposedPort(HashicorpVaultProperties.DEFAULT_SERVICE_PORT,
+                            HashicorpVaultProperties.DEFAULT_SERVICE_PORT);
+                } else {
+                    
withExposedPorts(HashicorpVaultProperties.DEFAULT_SERVICE_PORT);
+                }
+            }
+        }
+
+        return new 
HashicorpVaultContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
 
b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
index f26c5595dfc..f441e77c397 100644
--- 
a/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
+++ 
b/test-infra/camel-test-infra-hivemq/src/main/java/org/apache/camel/test/infra/hivemq/services/LocalHiveMQSparkplugTCKInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.hivemq.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.hivemq.common.HiveMQProperties;
 import org.testcontainers.hivemq.HiveMQContainer;
 import org.testcontainers.images.builder.ImageFromDockerfile;
@@ -43,9 +44,19 @@ public class LocalHiveMQSparkplugTCKInfraService extends 
AbstractLocalHiveMQServ
                 = new ImageFromDockerfile(imageName, 
false).withFileFromClasspath(".", dockerfileResourcePath);
         String newImageName = newImage.get();
 
-        HiveMQContainer newContainer
-                = new 
HiveMQContainer(DockerImageName.parse(newImageName).asCompatibleSubstituteFor("hivemq/hivemq-ce"));
+        class TestInfraHiveMQContainer extends HiveMQContainer {
+            public TestInfraHiveMQContainer(boolean fixedPort) {
+                super(DockerImageName.parse(newImageName)
+                        .asCompatibleSubstituteFor("hivemq/hivemq-ce"));
 
-        return newContainer;
+                if (fixedPort) {
+                    addFixedExposedPort(1883, 1883);
+                } else {
+                    addExposedPort(1883);
+                }
+            }
+        }
+
+        return new 
TestInfraHiveMQContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 }
diff --git 
a/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
index ab334c92090..036d6cf21be 100644
--- 
a/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-infinispan/src/main/java/org/apache/camel/test/infra/infinispan/services/InfinispanLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.util.function.Consumer;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.infinispan.common.InfinispanProperties;
 import org.slf4j.Logger;
@@ -63,21 +64,29 @@ public class InfinispanLocalContainerInfraService 
implements InfinispanInfraServ
         final Logger containerLog = LoggerFactory.getLogger("container." + 
containerName);
         final Consumer<OutputFrame> logConsumer = new 
Slf4jLogConsumer(containerLog);
 
-        final GenericContainer c = new GenericContainer<>(imageName)
-                .withNetworkAliases(containerName)
-                .withEnv("USER", DEFAULT_USERNAME)
-                .withEnv("PASS", DEFAULT_PASSWORD)
-                .withLogConsumer(logConsumer)
-                .withClasspathResourceMapping("infinispan.xml", 
"/user-config/infinispan.xml", BindMode.READ_ONLY)
-                .withCommand("-c", "/user-config/infinispan.xml")
-                
.waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1));
-        if (isNetworkHost) {
-            c.withNetworkMode("host");
-        } else {
-            c.withExposedPorts(InfinispanProperties.DEFAULT_SERVICE_PORT)
-                    .waitingFor(Wait.forListeningPort());
+        class InfinispanContainer extends 
GenericContainer<InfinispanContainer> {
+            public InfinispanContainer(boolean fixedPort) {
+                super(imageName);
+                withNetworkAliases(containerName)
+                        .withEnv("USER", DEFAULT_USERNAME)
+                        .withEnv("PASS", DEFAULT_PASSWORD)
+                        .withLogConsumer(logConsumer)
+                        .withClasspathResourceMapping("infinispan.xml", 
"/user-config/infinispan.xml", BindMode.READ_ONLY)
+                        .withCommand("-c", "/user-config/infinispan.xml")
+                        
.waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1));
+
+                if (isNetworkHost) {
+                    withNetworkMode("host");
+                } else if (fixedPort) {
+                    
addFixedExposedPort(InfinispanProperties.DEFAULT_SERVICE_PORT, 
InfinispanProperties.DEFAULT_SERVICE_PORT);
+                } else {
+                    withExposedPorts(InfinispanProperties.DEFAULT_SERVICE_PORT)
+                            .waitingFor(Wait.forListeningPort());
+                }
+            }
         }
-        return c;
+
+        return new 
InfinispanContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
 
b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
index e50b73494e7..40a484879dc 100644
--- 
a/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
+++ 
b/test-infra/camel-test-infra-kafka/src/main/java/org/apache/camel/test/infra/kafka/services/ContainerLocalKafkaInfraService.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.infra.kafka.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.kafka.common.KafkaProperties;
 import org.slf4j.Logger;
@@ -46,9 +47,18 @@ public class ContainerLocalKafkaInfraService implements 
KafkaInfraService, Conta
     }
 
     protected KafkaContainer initContainer() {
-        return new KafkaContainer(
-                
DockerImageName.parse(System.getProperty(KafkaProperties.KAFKA_CONTAINER, 
KAFKA3_IMAGE_NAME))
+        class TestInfraKafkaContainer extends KafkaContainer {
+            public TestInfraKafkaContainer(boolean fixedPort) {
+                
super(DockerImageName.parse(System.getProperty(KafkaProperties.KAFKA_CONTAINER, 
KAFKA3_IMAGE_NAME))
                         .asCompatibleSubstituteFor("apache/kafka"));
+
+                if (fixedPort) {
+                    addFixedExposedPort(9092, 9092);
+                }
+            }
+        }
+
+        return new 
TestInfraKafkaContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     public String getBootstrapServers() {
diff --git 
a/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
 
b/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
index 350b043ac2e..725a268b61e 100644
--- 
a/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-microprofile-lra/src/main/java/org/apache/camel/test/infra/microprofile/lra/services/MicroprofileLRALocalContainerInfraService.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.infra.microprofile.lra.services;
 import com.github.dockerjava.api.model.Network;
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import 
org.apache.camel.test.infra.microprofile.lra.common.MicroprofileLRAProperties;
 import org.slf4j.Logger;
@@ -56,11 +57,23 @@ public class MicroprofileLRALocalContainerInfraService
     }
 
     public GenericContainer initContainer(String imageName, String 
networkAlias) {
-        return new GenericContainer<>(DockerImageName.parse(imageName))
-                .withNetworkAliases(networkAlias)
-                .withExposedPorts(MicroprofileLRAProperties.DEFAULT_PORT)
-                .waitingFor(Wait.forListeningPort())
-                
.waitingFor(Wait.forLogMessage(".*lra-coordinator-quarkus.*Listening on.*", 1));
+        class MicroprofileLRAContainer extends 
GenericContainer<MicroprofileLRAContainer> {
+            public MicroprofileLRAContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName));
+
+                withNetworkAliases(networkAlias)
+                        .waitingFor(Wait.forListeningPort())
+                        
.waitingFor(Wait.forLogMessage(".*lra-coordinator-quarkus.*Listening on.*", 1));
+
+                if (fixedPort) {
+                    
addFixedExposedPort(MicroprofileLRAProperties.DEFAULT_PORT, 
MicroprofileLRAProperties.DEFAULT_PORT);
+                } else {
+                    withExposedPorts(MicroprofileLRAProperties.DEFAULT_PORT);
+                }
+            }
+        }
+
+        return new 
MicroprofileLRAContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
index 39325164df2..68380d19509 100644
--- 
a/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-milvus/src/main/java/org/apache/camel/test/infra/milvus/services/MilvusLocalContainerInfraService.java
@@ -22,6 +22,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.milvus.common.MilvusProperties;
 import org.slf4j.Logger;
@@ -51,8 +52,19 @@ public class MilvusLocalContainerInfraService implements 
MilvusInfraService, Con
     }
 
     protected MilvusContainer initContainer(String imageName) {
-        return new 
MilvusContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("milvusdb/milvus"))
-                .withStartupTimeout(Duration.ofMinutes(3L));
+        class TestInfraMilvusContainer extends MilvusContainer {
+            public TestInfraMilvusContainer(boolean fixedPort) {
+                
super(DockerImageName.parse(imageName).asCompatibleSubstituteFor("milvusdb/milvus"));
+                withStartupTimeout(Duration.ofMinutes(3L));
+
+                if (fixedPort) {
+                    addFixedExposedPort(9091, 9091);
+                    addFixedExposedPort(19530, 19530);
+                }
+            }
+        }
+
+        return new 
TestInfraMilvusContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
index c28003548fb..8e2b4e0f1d8 100644
--- 
a/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-minio/src/main/java/org/apache/camel/test/infra/minio/services/MinioLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.minio.common.MinioProperties;
 import org.slf4j.Logger;
@@ -58,16 +59,28 @@ public class MinioLocalContainerInfraService implements 
MinioInfraService, Conta
     }
 
     protected GenericContainer initContainer(String imageName, String 
containerName) {
-        return new GenericContainer(imageName)
-                .withNetworkAliases(containerName)
-                .withEnv("MINIO_ACCESS_KEY", accessKey())
-                .withEnv("MINIO_SECRET_KEY", secretKey())
-                .withCommand("server /data")
-                .withExposedPorts(BROKER_PORT)
-                .waitingFor(new HttpWaitStrategy()
-                        .forPath("/minio/health/live")
-                        .forPort(BROKER_PORT)
-                        .withStartupTimeout(Duration.ofSeconds(10)));
+
+        class MinioContainer extends GenericContainer<MinioContainer> {
+            public MinioContainer(boolean fixedPort) {
+                super(imageName);
+                withNetworkAliases(containerName)
+                        .withEnv("MINIO_ACCESS_KEY", accessKey())
+                        .withEnv("MINIO_SECRET_KEY", secretKey())
+                        .withCommand("server /data")
+                        .waitingFor(new HttpWaitStrategy()
+                                .forPath("/minio/health/live")
+                                .forPort(BROKER_PORT)
+                                .withStartupTimeout(Duration.ofSeconds(10)));
+
+                if (fixedPort) {
+                    addFixedExposedPort(BROKER_PORT, BROKER_PORT);
+                } else {
+                    withExposedPorts(BROKER_PORT);
+                }
+            }
+        }
+
+        return new 
MinioContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
index 733b7ba54fc..4d656dbaa45 100644
--- 
a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerInfraService.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.infra.mongodb.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.mongodb.common.MongoDBProperties;
 import org.slf4j.Logger;
@@ -47,11 +48,31 @@ public class MongoDBLocalContainerInfraService implements 
MongoDBInfraService, C
     }
 
     protected MongoDBContainer initContainer(String imageName) {
+
+        class TestInfraMongoDBContainer extends MongoDBContainer {
+            public TestInfraMongoDBContainer(boolean fixedPort) {
+                super();
+                addPort(fixedPort);
+            }
+
+            public TestInfraMongoDBContainer(boolean fixedPort, String 
imageName) {
+                
super(DockerImageName.parse(imageName).asCompatibleSubstituteFor("mongo"));
+                addPort(fixedPort);
+            }
+
+            private void addPort(boolean fixedPort) {
+                if (fixedPort) {
+                    addFixedExposedPort(27017, 27017);
+                } else {
+                    addExposedPort(27017);
+                }
+            }
+        }
+
         if (imageName == null || imageName.isEmpty()) {
-            return new MongoDBContainer();
+            return new 
TestInfraMongoDBContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
         } else {
-            return new MongoDBContainer(
-                    
DockerImageName.parse(imageName).asCompatibleSubstituteFor("mongo"));
+            return new 
TestInfraMongoDBContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()),
 imageName);
         }
     }
 
diff --git 
a/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
index 99e2d2bac70..1659dd1532b 100644
--- 
a/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-mosquitto/src/main/java/org/apache/camel/test/infra/mosquitto/services/MosquittoLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.mosquitto.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.mosquitto.common.MosquittoProperties;
 import org.slf4j.Logger;
@@ -52,7 +53,11 @@ public class MosquittoLocalContainerInfraService implements 
MosquittoInfraServic
     }
 
     public MosquittoLocalContainerInfraService(String imageName) {
-        container = initContainer(imageName, null);
+        if (ContainerEnvironmentUtil.isFixedPort(this.getClass())) {
+            container = initContainer(imageName, CONTAINER_PORT);
+        } else {
+            container = initContainer(imageName, null);
+        }
     }
 
     public MosquittoLocalContainerInfraService(GenericContainer container) {
diff --git 
a/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
index 1fa3e8ad6fe..1c0a4799057 100644
--- 
a/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-nats/src/main/java/org/apache/camel/test/infra/nats/services/NatsLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.nats.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.nats.common.NatsProperties;
 import org.slf4j.Logger;
@@ -44,10 +45,22 @@ public class NatsLocalContainerInfraService implements 
NatsInfraService, Contain
     }
 
     protected GenericContainer initContainer(String imageName, String 
containerName) {
-        return new GenericContainer(imageName)
-                .withNetworkAliases(containerName)
-                .withExposedPorts(PORT)
-                
.waitingFor(Wait.forLogMessage(".*Listening.*for.*route.*connections.*", 1));
+        class NatsContainer extends GenericContainer<NatsContainer> {
+            public NatsContainer(boolean fixedPort) {
+                super(imageName);
+
+                withNetworkAliases(containerName)
+                        
.waitingFor(Wait.forLogMessage(".*Listening.*for.*route.*connections.*", 1));
+
+                if (fixedPort) {
+                    addFixedExposedPort(PORT, PORT);
+                } else {
+                    withExposedPorts(PORT);
+                }
+            }
+        }
+
+        return new 
NatsContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-neo4j/src/main/java/org/apache/camel/test/infra/neo4j/services/Neo4jLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-neo4j/src/main/java/org/apache/camel/test/infra/neo4j/services/Neo4jLocalContainerInfraService.java
index 2c0ffd009f1..5d16874eed9 100644
--- 
a/test-infra/camel-test-infra-neo4j/src/main/java/org/apache/camel/test/infra/neo4j/services/Neo4jLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-neo4j/src/main/java/org/apache/camel/test/infra/neo4j/services/Neo4jLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.neo4j.common.Neo4jProperties;
 import org.slf4j.Logger;
@@ -51,9 +52,22 @@ public class Neo4jLocalContainerInfraService implements 
Neo4jInfraService, Conta
     }
 
     protected Neo4jContainer initContainer(String imageName) {
-        return new 
Neo4jContainer<>(DockerImageName.parse(imageName).asCompatibleSubstituteFor("neo4j"))
-                .withStartupTimeout(Duration.ofMinutes(3L))
-                .withRandomPassword();
+        class TestInfraNeo4jContainer extends Neo4jContainer {
+            public TestInfraNeo4jContainer(boolean fixedPort) {
+                
super(DockerImageName.parse(imageName).asCompatibleSubstituteFor("neo4j"));
+
+                withStartupTimeout(Duration.ofMinutes(3L));
+                withRandomPassword();
+
+                if (fixedPort) {
+                    addFixedExposedPort(7687, 7687);
+                    addFixedExposedPort(7473, 7473);
+                    addFixedExposedPort(7474, 7474);
+                }
+            }
+        }
+
+        return new 
TestInfraNeo4jContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
index c6896bab074..fc2ed90fb89 100644
--- 
a/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-ollama/src/main/java/org/apache/camel/test/infra/ollama/services/OllamaLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.ollama.commons.OllamaProperties;
 import org.slf4j.Logger;
@@ -59,9 +60,18 @@ public class OllamaLocalContainerInfraService implements 
OllamaInfraService, Con
     }
 
     protected OllamaContainer initContainer() {
-        return new OllamaContainer(
-                DockerImageName.parse(CONTAINER_NAME)
+        class TestInfraOllamaContainer extends OllamaContainer {
+            public TestInfraOllamaContainer(boolean fixedPort) {
+                super(DockerImageName.parse(CONTAINER_NAME)
                         .asCompatibleSubstituteFor("ollama/ollama"));
+
+                if (fixedPort) {
+                    addFixedExposedPort(11434, 11434);
+                }
+            }
+        }
+
+        return new 
TestInfraOllamaContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenLdapContainer.java
 
b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenLdapContainer.java
index 25f01307c07..19efa228a32 100644
--- 
a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenLdapContainer.java
+++ 
b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenLdapContainer.java
@@ -26,11 +26,16 @@ public class OpenLdapContainer extends 
GenericContainer<OpenLdapContainer> {
     public static final int CONTAINER_PORT_LDAP = 389;
     public static final int CONTAINER_PORT_LDAP_OVER_SSL = 636;
 
-    public OpenLdapContainer() {
+    public OpenLdapContainer(boolean fixedPort) {
         
super(LocalPropertyResolver.getProperty(OpenldapLocalContainerInfraService.class,
                 OpenldapProperties.OPENLDAP_CONTAINER));
 
-        this.withExposedPorts(CONTAINER_PORT_LDAP, 
CONTAINER_PORT_LDAP_OVER_SSL)
-                .withNetworkAliases(CONTAINER_NAME);
+        if (fixedPort) {
+            this.addFixedExposedPort(CONTAINER_PORT_LDAP, CONTAINER_PORT_LDAP);
+            this.addFixedExposedPort(CONTAINER_PORT_LDAP_OVER_SSL, 
CONTAINER_PORT_LDAP_OVER_SSL);
+        } else {
+            this.withExposedPorts(CONTAINER_PORT_LDAP, 
CONTAINER_PORT_LDAP_OVER_SSL)
+                    .withNetworkAliases(CONTAINER_NAME);
+        }
     }
 }
diff --git 
a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
index 68978f1a00c..67fe021b743 100644
--- 
a/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-openldap/src/main/java/org/apache/camel/test/infra/openldap/services/OpenldapLocalContainerInfraService.java
@@ -17,6 +17,7 @@
 package org.apache.camel.test.infra.openldap.services;
 
 import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.openldap.common.OpenldapProperties;
 import org.slf4j.Logger;
@@ -34,7 +35,7 @@ public class OpenldapLocalContainerInfraService implements 
OpenldapInfraService,
     private final OpenLdapContainer container;
 
     public OpenldapLocalContainerInfraService() {
-        container = new OpenLdapContainer();
+        container = new 
OpenLdapContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-opensearch/src/main/java/org/apache/camel/test/infra/opensearch/services/OpenSearchLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-opensearch/src/main/java/org/apache/camel/test/infra/opensearch/services/OpenSearchLocalContainerInfraService.java
index d6023d398fc..1d6ed8441cf 100644
--- 
a/test-infra/camel-test-infra-opensearch/src/main/java/org/apache/camel/test/infra/opensearch/services/OpenSearchLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-opensearch/src/main/java/org/apache/camel/test/infra/opensearch/services/OpenSearchLocalContainerInfraService.java
@@ -51,20 +51,27 @@ public class OpenSearchLocalContainerInfraService 
implements OpenSearchInfraServ
     }
 
     protected OpensearchContainer initContainer(String imageName) {
-        DockerImageName customImage = DockerImageName.parse(imageName)
-                .asCompatibleSubstituteFor("opensearchproject/opensearch");
-        OpensearchContainer opensearchContainer = new 
OpensearchContainer(customImage);
-        // Increase the timeout from 60 seconds to 90 seconds to ensure that 
it will be long enough
-        // on the build pipeline
-        opensearchContainer.setWaitStrategy(
-                new LogMessageWaitStrategy()
-                        .withRegEx(".*(\"message\":\\s?\"started[\\s?|\"].*|] 
started\n$)")
-                        .withStartupTimeout(Duration.ofSeconds(90)));
-
-        opensearchContainer.withLogConsumer(new Slf4jLogConsumer(LOG));
-
-        return opensearchContainer;
-
+        class TestInfraOpensearchContainer extends OpensearchContainer {
+            public TestInfraOpensearchContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        
.asCompatibleSubstituteFor("opensearchproject/opensearch"));
+
+                // Increase the timeout from 60 seconds to 90 seconds to 
ensure that it will be long enough
+                // on the build pipeline
+                setWaitStrategy(
+                        new LogMessageWaitStrategy()
+                                
.withRegEx(".*(\"message\":\\s?\"started[\\s?|\"].*|] started\n$)")
+                                .withStartupTimeout(Duration.ofSeconds(90)));
+
+                withLogConsumer(new Slf4jLogConsumer(LOG));
+
+                if (fixedPort) {
+                    addFixedExposedPort(OPEN_SEARCH_PORT, OPEN_SEARCH_PORT);
+                }
+            }
+        }
+
+        return new 
TestInfraOpensearchContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeIndexContainer.java
 
b/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeIndexContainer.java
index d828615498a..40f96c066d6 100644
--- 
a/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeIndexContainer.java
+++ 
b/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeIndexContainer.java
@@ -31,10 +31,10 @@ public class PineconeIndexContainer extends 
GenericContainer<PineconeIndexContai
             "ghcr.io/pinecone-io/pinecone-index");
 
     public PineconeIndexContainer(String dockerImageName) {
-        this(DockerImageName.parse(dockerImageName));
+        this(DockerImageName.parse(dockerImageName), false);
     }
 
-    public PineconeIndexContainer(DockerImageName dockerImageName) {
+    public PineconeIndexContainer(DockerImageName dockerImageName, boolean 
fixedPort) {
         super(dockerImageName);
         dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
         withEnv("PINECONE_HOST", "localhost");
@@ -43,7 +43,11 @@ public class PineconeIndexContainer extends 
GenericContainer<PineconeIndexContai
         withEnv("INDEX_TYPE", "serverless");
         withEnv("METRIC", "cosine");
         withEnv("PORT", String.valueOf(CLIENT_PORT));
-        withExposedPorts(CLIENT_PORT);
+        if (fixedPort) {
+            addFixedExposedPort(CLIENT_PORT, CLIENT_PORT);
+        } else {
+            withExposedPorts(CLIENT_PORT);
+        }
     }
 
     public String getEndpoint() {
diff --git 
a/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeLocalContainerInfraService.java
index 858d9282b70..c79a111148e 100644
--- 
a/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-pinecone/src/main/java/org/apache/camel/test/infra/pinecone/services/PineconeLocalContainerInfraService.java
@@ -22,6 +22,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.pinecone.common.PineconeProperties;
 import org.slf4j.Logger;
@@ -52,9 +53,20 @@ public class PineconeLocalContainerInfraService implements 
PineconeInfraService,
     }
 
     protected PineconeLocalContainer initContainer(String imageName) {
-        return new PineconeLocalContainer(
-                
DockerImageName.parse(imageName).asCompatibleSubstituteFor("pinecone-io/pinecone-local"))
-                .withStartupTimeout(Duration.ofMinutes(3L));
+        class TestInfraPineconeLocalContainer extends PineconeLocalContainer {
+            public TestInfraPineconeLocalContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        
.asCompatibleSubstituteFor("pinecone-io/pinecone-local"));
+
+                withStartupTimeout(Duration.ofMinutes(3L));
+
+                if (fixedPort) {
+                    addFixedExposedPort(5080, 5080);
+                }
+            }
+        }
+
+        return new 
TestInfraPineconeLocalContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
index 613c73894e8..1fb3d2f4556 100644
--- 
a/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-postgres/src/main/java/org/apache/camel/test/infra/postgres/services/PostgresLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.postgres.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.postgres.common.PostgresProperties;
 import org.slf4j.Logger;
@@ -48,8 +49,18 @@ public class PostgresLocalContainerInfraService implements 
PostgresInfraService,
     }
 
     protected PostgreSQLContainer initContainer(String imageName) {
-        return new PostgreSQLContainer(
-                
DockerImageName.parse(imageName).asCompatibleSubstituteFor("postgres"));
+        class TestInfraPostgreSQLContainer extends PostgreSQLContainer {
+            public TestInfraPostgreSQLContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        .asCompatibleSubstituteFor("postgres"));
+
+                if (fixedPort) {
+                    addFixedExposedPort(5432, 5432);
+                }
+            }
+        }
+
+        return new 
TestInfraPostgreSQLContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
index 5e268e5f34f..c209526e638 100644
--- 
a/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-pulsar/src/main/java/org/apache/camel/test/infra/pulsar/services/PulsarLocalContainerInfraService.java
@@ -20,6 +20,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.pulsar.common.PulsarProperties;
 import org.slf4j.Logger;
@@ -49,8 +50,21 @@ public class PulsarLocalContainerInfraService implements 
PulsarInfraService, Con
     }
 
     protected PulsarContainer initContainer(String imageName) {
-        return new 
PulsarContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("apachepulsar/pulsar"))
-                .withStartupTimeout(Duration.ofMinutes(3L));
+        class TestInfraPulsarContainer extends PulsarContainer {
+            public TestInfraPulsarContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        .asCompatibleSubstituteFor("apachepulsar/pulsar"));
+
+                withStartupTimeout(Duration.ofMinutes(3L));
+
+                if (fixedPort) {
+                    addFixedExposedPort(6650, 6650);
+                    addFixedExposedPort(8085, 8080);
+                }
+            }
+        }
+
+        return new 
TestInfraPulsarContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
index df64ddf6841..a2b7817ca3e 100644
--- 
a/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-qdrant/src/main/java/org/apache/camel/test/infra/qdrant/services/QdrantLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.qdrant.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.qdrant.common.QdrantProperties;
 import org.slf4j.Logger;
@@ -42,13 +43,29 @@ public class QdrantLocalContainerInfraService implements 
QdrantInfraService, Con
     }
 
     public QdrantLocalContainerInfraService(String imageName) {
-        this(new 
QdrantContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("qdrant/qdrant")));
+        this.container = initContainer(imageName, 
ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     public QdrantLocalContainerInfraService(QdrantContainer container) {
         this.container = container;
     }
 
+    private QdrantContainer initContainer(String imageName, boolean fixedPort) 
{
+        class TestInfraQdrantContainer extends QdrantContainer {
+            public TestInfraQdrantContainer() {
+                super(DockerImageName.parse(imageName)
+                        .asCompatibleSubstituteFor("qdrant/qdrant"));
+
+                if (fixedPort) {
+                    addFixedExposedPort(6333, 6333);
+                    addFixedExposedPort(6334, 6334);
+                }
+            }
+        }
+
+        return new TestInfraQdrantContainer();
+    }
+
     @Override
     public void registerProperties() {
         System.setProperty(QdrantProperties.QDRANT_HTTP_HOST, getHttpHost());
diff --git 
a/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
index e101cef1e18..57a4737117e 100644
--- 
a/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-rabbitmq/src/main/java/org/apache/camel/test/infra/rabbitmq/services/RabbitMQLocalContainerInfraService.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.infra.rabbitmq.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.rabbitmq.common.RabbitMQProperties;
 import org.slf4j.Logger;
@@ -48,7 +49,20 @@ public class RabbitMQLocalContainerInfraService implements 
RabbitMQInfraService,
     }
 
     protected RabbitMQContainer initContainer(String imageName) {
-        return new 
RabbitMQContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("rabbitmq"));
+        class TestInfraRabbitMQContainer extends RabbitMQContainer {
+            public TestInfraRabbitMQContainer(boolean fixedPort) {
+                
super(DockerImageName.parse(imageName).asCompatibleSubstituteFor("rabbitmq"));
+
+                if (fixedPort) {
+                    addFixedExposedPort(5672, 5672);
+                    addFixedExposedPort(5671, 5671);
+                    addFixedExposedPort(15671, 15671);
+                    addFixedExposedPort(15672, 15672);
+                }
+            }
+        }
+
+        return new 
TestInfraRabbitMQContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisContainer.java
 
b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisContainer.java
index ed86edcb5c7..b14470b13d8 100644
--- 
a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisContainer.java
+++ 
b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisContainer.java
@@ -38,7 +38,20 @@ public class RedisContainer extends 
GenericContainer<RedisContainer> {
         super(DockerImageName.parse(imageName));
     }
 
-    public static RedisContainer initContainer(String imageName, String 
networkAlias) {
+    public static RedisContainer initContainer(String imageName, String 
networkAlias, boolean fixedPort) {
+        class TestInfraRedisContainer extends RedisContainer {
+            public TestInfraRedisContainer() {
+                super(imageName);
+                waitingFor(Wait.forListeningPort());
+
+                if (fixedPort) {
+                    addFixedExposedPort(RedisProperties.DEFAULT_PORT, 
RedisProperties.DEFAULT_PORT);
+                } else {
+                    withNetworkAliases(networkAlias)
+                            .withExposedPorts(RedisProperties.DEFAULT_PORT);
+                }
+            }
+        }
         return new RedisContainer(imageName)
                 .withNetworkAliases(networkAlias)
                 .withExposedPorts(RedisProperties.DEFAULT_PORT)
diff --git 
a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
index 9c1251ef14d..cb4bf601024 100644
--- 
a/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-redis/src/main/java/org/apache/camel/test/infra/redis/services/RedisLocalContainerInfraService.java
@@ -17,6 +17,7 @@
 package org.apache.camel.test.infra.redis.services;
 
 import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.redis.common.RedisProperties;
 import org.slf4j.Logger;
@@ -35,7 +36,8 @@ public class RedisLocalContainerInfraService implements 
RedisInfraService, Conta
     }
 
     public RedisLocalContainerInfraService(String imageName) {
-        container = RedisContainer.initContainer(imageName, 
RedisContainer.CONTAINER_NAME);
+        container = RedisContainer.initContainer(imageName, 
RedisContainer.CONTAINER_NAME,
+                ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
index f654cabc5f2..6cbbe0ee2a6 100644
--- 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
+++ 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
@@ -26,13 +26,19 @@ import org.testcontainers.containers.wait.strategy.Wait;
 
 public class RocketMQBrokerContainer extends 
GenericContainer<RocketMQBrokerContainer> {
 
-    public RocketMQBrokerContainer(Network network, String confName) {
+    public RocketMQBrokerContainer(Network network, String confName, boolean 
fixedPort) {
         super(RocketMQContainerInfraService.ROCKETMQ_IMAGE);
 
-        withNetwork(network);
-        withExposedPorts(RocketMQProperties.ROCKETMQ_BROKER3_PORT,
-                RocketMQProperties.ROCKETMQ_BROKER2_PORT,
-                RocketMQProperties.ROCKETMQ_BROKER1_PORT);
+        if (fixedPort) {
+            addFixedExposedPort(RocketMQProperties.ROCKETMQ_BROKER3_PORT, 
RocketMQProperties.ROCKETMQ_BROKER3_PORT);
+            addFixedExposedPort(RocketMQProperties.ROCKETMQ_BROKER2_PORT, 
RocketMQProperties.ROCKETMQ_BROKER2_PORT);
+            addFixedExposedPort(RocketMQProperties.ROCKETMQ_BROKER1_PORT, 
RocketMQProperties.ROCKETMQ_BROKER1_PORT);
+        } else {
+            withNetwork(network);
+            withExposedPorts(RocketMQProperties.ROCKETMQ_BROKER3_PORT,
+                    RocketMQProperties.ROCKETMQ_BROKER2_PORT,
+                    RocketMQProperties.ROCKETMQ_BROKER1_PORT);
+        }
         withEnv("NAMESRV_ADDR", "nameserver:9876");
         withClasspathResourceMapping(confName + "/" + confName + ".conf",
                 "/opt/rocketmq-" + 
RocketMQContainerInfraService.ROCKETMQ_VERSION + "/conf/broker.conf",
diff --git 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
index 36aca171f80..8b6c5898506 100644
--- 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQContainerInfraService.java
@@ -21,6 +21,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.rocketmq.common.RocketMQProperties;
 import org.awaitility.Awaitility;
@@ -49,7 +50,8 @@ public class RocketMQContainerInfraService implements 
RocketMQInfraService, Cont
 
         nameserverContainer = new RocketMQNameserverContainer(network);
 
-        brokerContainer1 = new RocketMQBrokerContainer(network, "broker1");
+        brokerContainer1
+                = new RocketMQBrokerContainer(network, "broker1", 
ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbContainer.java
 
b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbContainer.java
index b0981487a7e..1150c7c5a83 100644
--- 
a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbContainer.java
+++ 
b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbContainer.java
@@ -27,13 +27,18 @@ public class SmbContainer extends 
GenericContainer<SmbContainer> {
     public static final String DEFAULT_USER = "camel";
     public static final String DEFAULT_PASSWORD = "camelTester123";
 
-    public SmbContainer() {
+    public SmbContainer(boolean fixedPort) {
         super(new ImageFromDockerfile("localhost/samba:camel", false)
                 .withFileFromClasspath(".",
                         "org/apache/camel/test/infra/smb/services/"));
 
-        super.withExposedPorts(SMB_PORT_DEFAULT)
-                .waitingFor(Wait.forListeningPort());
+        if (fixedPort) {
+            addFixedExposedPort(SMB_PORT_DEFAULT, SMB_PORT_DEFAULT);
+        } else {
+            super.withExposedPorts(SMB_PORT_DEFAULT);
+        }
+
+        waitingFor(Wait.forListeningPort());
     }
 
     public String getUser() {
diff --git 
a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
index a6141779566..c27aed19408 100644
--- 
a/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-smb/src/main/java/org/apache/camel/test/infra/smb/services/SmbLocalContainerInfraService.java
@@ -17,6 +17,7 @@
 package org.apache.camel.test.infra.smb.services;
 
 import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,7 +27,7 @@ import org.slf4j.LoggerFactory;
               serviceAlias = "smb")
 public class SmbLocalContainerInfraService implements SmbInfraService {
     protected static final Logger LOG = 
LoggerFactory.getLogger(SmbLocalContainerInfraService.class);
-    protected final SmbContainer container = new SmbContainer();
+    protected final SmbContainer container = new 
SmbContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
 
     public SmbLocalContainerInfraService() {
     }
diff --git 
a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
 
b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
index 91fbf71319b..1e2526fd01c 100644
--- 
a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
+++ 
b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
@@ -48,16 +48,23 @@ public class SolrContainer extends 
GenericContainer<SolrContainer> {
         super(DockerImageName.parse(imageName));
     }
 
-    public static SolrContainer initContainer(String networkAlias) {
-        return new SolrContainer()
+    public static SolrContainer initContainer(String networkAlias, boolean 
fixedPort) {
+        SolrContainer solrContainer = new SolrContainer()
                 .withNetworkAliases(networkAlias)
                 .withEnv("SOLR_OPTS", 
"-Dsolr.environment=test,label=camel-solr-test-infra,color=sandybrown")
                 .withEnv("GC_LOG_OPTS", "-verbose:")
                 .withAccessToHost(true)
                 .withLogConsumer(new 
Slf4jLogConsumer(LOG).withPrefix(CONTAINER_NAME))
-                .withExposedPorts(SolrProperties.DEFAULT_PORT)
                 .withCommand(SOLR_CONTAINER_COMMANDS)
                 .waitingFor(Wait.forHttp("/solr/" + SOLR_DFT_COLLECTION + 
"/admin/ping?docker-ping"));
+
+        if (fixedPort) {
+            solrContainer.addFixedExposedPort(SolrProperties.DEFAULT_PORT, 
SolrProperties.DEFAULT_PORT);
+        } else {
+            solrContainer.withExposedPorts(SolrProperties.DEFAULT_PORT);
+        }
+
+        return solrContainer;
     }
 
 }
diff --git 
a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
index 1f8281c05e5..aaa642fd682 100644
--- 
a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
@@ -17,6 +17,7 @@
 package org.apache.camel.test.infra.solr.services;
 
 import org.apache.camel.spi.annotations.InfraService;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.solr.common.SolrProperties;
 import org.slf4j.Logger;
@@ -31,7 +32,8 @@ public class SolrLocalContainerInfraService implements 
SolrInfraService, Contain
     private final SolrContainer container;
 
     public SolrLocalContainerInfraService() {
-        container = SolrContainer.initContainer(SolrContainer.CONTAINER_NAME);
+        container = SolrContainer.initContainer(SolrContainer.CONTAINER_NAME,
+                ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
index 6db5574cd7b..3ea667651c7 100644
--- 
a/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-torchserve/src/main/java/org/apache/camel/test/infra/torchserve/services/TorchServeLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.torchserve.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.torchserve.common.TorchServeProperties;
 import org.slf4j.Logger;
@@ -52,16 +53,30 @@ public class TorchServeLocalContainerInfraService 
implements TorchServeInfraServ
 
     @SuppressWarnings("resource")
     protected GenericContainer<?> initContainer(String imageName) {
-        return new GenericContainer<>(DockerImageName.parse(imageName))
-                .withExposedPorts(INFERENCE_PORT, MANAGEMENT_PORT, 
METRICS_PORT)
-                .withCopyFileToContainer(
+        class TorchServeContainer extends 
GenericContainer<TorchServeContainer> {
+            public TorchServeContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName));
+
+                withCopyFileToContainer(
                         
MountableFile.forClasspathResource("config.properties"),
                         "/home/model-server/config.properties")
-                .withCopyFileToContainer(
-                        
MountableFile.forClasspathResource("models/squeezenet1_1.mar"),
-                        "/home/model-server/model-store/squeezenet1_1.mar")
-                .waitingFor(Wait.forListeningPorts(INFERENCE_PORT, 
MANAGEMENT_PORT, METRICS_PORT))
-                .withCommand(CONTAINER_COMMAND);
+                        .withCopyFileToContainer(
+                                
MountableFile.forClasspathResource("models/squeezenet1_1.mar"),
+                                
"/home/model-server/model-store/squeezenet1_1.mar")
+                        .waitingFor(Wait.forListeningPorts(INFERENCE_PORT, 
MANAGEMENT_PORT, METRICS_PORT))
+                        .withCommand(CONTAINER_COMMAND);
+
+                if (fixedPort) {
+                    addFixedExposedPort(INFERENCE_PORT, INFERENCE_PORT);
+                    addFixedExposedPort(MANAGEMENT_PORT, MANAGEMENT_PORT);
+                    addFixedExposedPort(METRICS_PORT, METRICS_PORT);
+                } else {
+                    withExposedPorts(INFERENCE_PORT, MANAGEMENT_PORT, 
METRICS_PORT);
+                }
+            }
+        }
+
+        return new 
TorchServeContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-weaviate/src/main/java/org/apache/camel/test/infra/weaviate/services/WeaviateLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-weaviate/src/main/java/org/apache/camel/test/infra/weaviate/services/WeaviateLocalContainerInfraService.java
index 8ba7b46515f..74b984a2225 100644
--- 
a/test-infra/camel-test-infra-weaviate/src/main/java/org/apache/camel/test/infra/weaviate/services/WeaviateLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-weaviate/src/main/java/org/apache/camel/test/infra/weaviate/services/WeaviateLocalContainerInfraService.java
@@ -22,6 +22,7 @@ import java.time.Duration;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.weaviate.common.WeaviateProperties;
 import org.slf4j.Logger;
@@ -52,8 +53,21 @@ public class WeaviateLocalContainerInfraService implements 
WeaviateInfraService,
     }
 
     protected WeaviateContainer initContainer(String imageName) {
-        return new 
WeaviateContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("semitechnologies/weaviate"))
-                .withStartupTimeout(Duration.ofMinutes(3L));
+        class TestInfraWeaviateContainer extends WeaviateContainer {
+            public TestInfraWeaviateContainer(boolean fixedPort) {
+                super(DockerImageName.parse(imageName)
+                        
.asCompatibleSubstituteFor("semitechnologies/weaviate"));
+
+                withStartupTimeout(Duration.ofMinutes(3L));
+
+                if (fixedPort) {
+                    addFixedExposedPort(8087, 8080);
+                    addFixedExposedPort(50051, 50051);
+                }
+            }
+        }
+
+        return new 
TestInfraWeaviateContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
 
b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
index aad09b7b955..01785fe9273 100644
--- 
a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
+++ 
b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppLocalContainerInfraService.java
@@ -18,6 +18,7 @@ package org.apache.camel.test.infra.xmpp.services;
 
 import org.apache.camel.spi.annotations.InfraService;
 import org.apache.camel.test.infra.common.LocalPropertyResolver;
+import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
 import org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.xmpp.common.XmppProperties;
 import org.slf4j.Logger;
@@ -44,7 +45,7 @@ public class XmppLocalContainerInfraService implements 
XmppInfraService, Contain
     }
 
     protected XmppServerContainer initContainer(String imageName) {
-        return new XmppServerContainer();
+        return new 
XmppServerContainer(ContainerEnvironmentUtil.isFixedPort(this.getClass()));
     }
 
     @Override
diff --git 
a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppServerContainer.java
 
b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppServerContainer.java
index 1ba12e250b9..6c721eed732 100644
--- 
a/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppServerContainer.java
+++ 
b/test-infra/camel-test-infra-xmpp/src/main/java/org/apache/camel/test/infra/xmpp/services/XmppServerContainer.java
@@ -43,6 +43,14 @@ public class XmppServerContainer extends 
GenericContainer<XmppServerContainer> {
                 .waitingFor(Wait.forLogMessage(".*Started Application in.*", 
1));
     }
 
+    public XmppServerContainer(boolean fixedPort) {
+        this();
+        if (fixedPort) {
+            addFixedExposedPort(XmppProperties.PORT_DEFAULT, 
XmppProperties.PORT_DEFAULT);
+            addFixedExposedPort(8088, PORT_REST);
+        }
+    }
+
     public String getUrl() {
         return String.format("%s:%d", this.getHost(), 
this.getMappedPort(XmppProperties.PORT_DEFAULT));
     }


Reply via email to