From 6a9355f2fb115f2c2fa49b5f56576d7f470b1d23 Mon Sep 17 00:00:00 2001 From: Me Date: Thu, 8 Feb 2024 06:04:15 +0100 Subject: [PATCH 1/6] make exposing host ports work when used together with a reusable container --- .../containers/GenericContainer.java | 4 +- .../containers/ExposedHostTest.java | 119 +++++++++++++++++- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 8e2b00d0adb..a40d910a1b8 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -446,7 +446,9 @@ private void tryStart() { copyToTransferableContainerPathMap.forEach(this::copyFileToContainer); } - connectToPortForwardingNetwork(createCommand.getNetworkMode()); + if (!reused) { + connectToPortForwardingNetwork(createCommand.getNetworkMode()); + } if (!reused) { containerIsCreated(containerId); diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 4a3142d9461..d4f29d90ed6 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -7,17 +7,23 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; import org.testcontainers.Testcontainers; +import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; public class ExposedHostTest { private static HttpServer server; + private static Network network; @BeforeClass public static void setUpClass() throws Exception { @@ -33,13 +39,14 @@ public static void setUpClass() throws Exception { } } ); - server.start(); + network = createReusableNetwork(UUID.randomUUID()); } @AfterClass public static void tearDownClass() { server.stop(0); + DockerClientFactory.instance().client().removeNetworkCmd(network.getId()).exec(); } @After @@ -82,6 +89,65 @@ public void testExposedHostPortOnFixedInternalPorts() { assertResponse(new GenericContainer<>(tinyContainerDef()), 81); } + @Test + public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + Testcontainers.exposeHostPorts(server.getAddress().getPort()); + + try ( + GenericContainer container = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network) + ) { + container.start(); + + assertHttpResponseFromHost(container, server.getAddress().getPort()); + + PortForwardingContainer.INSTANCE.reset(); + Testcontainers.exposeHostPorts(server.getAddress().getPort()); + + try ( + GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network) + ) { + reusedContainer.start(); + + assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); + assertHttpResponseFromHost(reusedContainer, server.getAddress().getPort()); + } + } + } + + @Test + public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() + throws IOException, InterruptedException { + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); + + try ( + GenericContainer container = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network) + ) { + container.start(); + + assertHttpResponseFromHost(container, 1234); + + PortForwardingContainer.INSTANCE.reset(); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); + + try ( + GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network) + ) { + reusedContainer.start(); + + assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); + assertHttpResponseFromHost(reusedContainer, 1234); + } + } + } + @SneakyThrows protected void assertResponse(GenericContainer container, int port) { try { @@ -108,4 +174,55 @@ private static class TinyContainerDef extends ContainerDef { setCommand("top"); } } + + private void assertHttpResponseFromHost(GenericContainer container, int port) + throws IOException, InterruptedException { + String httpResponseFromHost = container + .execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:" + port) + .getStdout(); + assertThat(httpResponseFromHost).isEqualTo("Hello World!"); + } + + private static Network createReusableNetwork(UUID name) { + String id = DockerClientFactory + .instance() + .client() + .listNetworksCmd() + .exec() + .stream() + .filter(network -> + network.getName().equals(name.toString()) && + network.getLabels().equals(DockerClientFactory.DEFAULT_LABELS) + ) + .map(com.github.dockerjava.api.model.Network::getId) + .findFirst() + .orElseGet(() -> + DockerClientFactory + .instance() + .client() + .createNetworkCmd() + .withName(name.toString()) + .withCheckDuplicate(true) + .withLabels(DockerClientFactory.DEFAULT_LABELS) + .exec() + .getId() + ); + + return new Network() { + @Override + public Statement apply(Statement base, Description description) { + return base; + } + + @Override + public String getId() { + return id; + } + + @Override + public void close() { + // never close + } + }; + } } From e841f761c538ecb3fdee2478d766a89c95406dc5 Mon Sep 17 00:00:00 2001 From: Me Date: Thu, 8 Feb 2024 06:04:15 +0100 Subject: [PATCH 2/6] make exposing host ports work when used together with a reusable container --- .../containers/ExposedHostTest.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index d4f29d90ed6..77491cc45e6 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -23,6 +23,7 @@ public class ExposedHostTest { private static HttpServer server; + private static Network network; @BeforeClass @@ -190,14 +191,16 @@ private static Network createReusableNetwork(UUID name) { .listNetworksCmd() .exec() .stream() - .filter(network -> - network.getName().equals(name.toString()) && - network.getLabels().equals(DockerClientFactory.DEFAULT_LABELS) - ) + .filter(network -> { + return ( + network.getName().equals(name.toString()) && + network.getLabels().equals(DockerClientFactory.DEFAULT_LABELS) + ); + }) .map(com.github.dockerjava.api.model.Network::getId) .findFirst() - .orElseGet(() -> - DockerClientFactory + .orElseGet(() -> { + return DockerClientFactory .instance() .client() .createNetworkCmd() @@ -205,8 +208,8 @@ private static Network createReusableNetwork(UUID name) { .withCheckDuplicate(true) .withLabels(DockerClientFactory.DEFAULT_LABELS) .exec() - .getId() - ); + .getId(); + }); return new Network() { @Override From b4a4e0f300e2fe0aaf45cf790b258f7d58ca2969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 5 Nov 2024 12:19:25 -0600 Subject: [PATCH 3/6] Polish --- .../containers/GenericContainer.java | 15 ++- .../containers/ExposedHostTest.java | 118 +++++++----------- 2 files changed, 56 insertions(+), 77 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 7d9ab52fed5..37e49a3b0cd 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -435,9 +435,7 @@ private void tryStart() { copyToTransferableContainerPathMap.forEach(this::copyFileToContainer); } - if (!reused) { - connectToPortForwardingNetwork(createCommand.getNetworkMode()); - } + connectToPortForwardingNetwork(createCommand.getNetworkMode()); if (!reused) { containerIsCreated(containerId); @@ -624,7 +622,14 @@ private void connectToPortForwardingNetwork(String networkMode) { .map(ContainerNetwork::getNetworkID) .ifPresent(networkId -> { if (!Arrays.asList(networkId, "none", "host").contains(networkMode)) { - dockerClient.connectToNetworkCmd().withContainerId(containerId).withNetworkId(networkId).exec(); + com.github.dockerjava.api.model.Network network = + this.dockerClient.inspectNetworkCmd().withNetworkId(networkId).exec(); + if (!network.getContainers().containsKey(this.containerId)) { + this.dockerClient.connectToNetworkCmd() + .withContainerId(this.containerId) + .withNetworkId(networkId) + .exec(); + } } }); } @@ -828,7 +833,7 @@ private void applyConfiguration(CreateContainerCmd createCommand) { withExtraHost(INTERNAL_HOST_HOSTNAME, it.getIpAddress()); }); - String[] extraHostsArray = extraHosts.stream().toArray(String[]::new); + String[] extraHostsArray = extraHosts.stream().distinct().toArray(String[]::new); createCommand.withExtraHosts(extraHostsArray); if (workingDirectory != null) { diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 77491cc45e6..588a7644679 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; +import java.util.List; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -94,29 +95,24 @@ public void testExposedHostPortOnFixedInternalPorts() { public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { Testcontainers.exposeHostPorts(server.getAddress().getPort()); - try ( - GenericContainer container = new GenericContainer<>(tinyContainerDef()) - .withReuse(true) - .withNetwork(network) - ) { - container.start(); + GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); + container.start(); - assertHttpResponseFromHost(container, server.getAddress().getPort()); + assertHttpResponseFromHost(container, server.getAddress().getPort()); - PortForwardingContainer.INSTANCE.reset(); - Testcontainers.exposeHostPorts(server.getAddress().getPort()); + PortForwardingContainer.INSTANCE.reset(); + Testcontainers.exposeHostPorts(server.getAddress().getPort()); - try ( - GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) - .withReuse(true) - .withNetwork(network) - ) { - reusedContainer.start(); + GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network); + reusedContainer.start(); - assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); - assertHttpResponseFromHost(reusedContainer, server.getAddress().getPort()); - } - } + assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); + assertHttpResponseFromHost(reusedContainer, server.getAddress().getPort()); + + container.stop(); + reusedContainer.stop(); } @Test @@ -124,29 +120,24 @@ public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetw throws IOException, InterruptedException { Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); - try ( - GenericContainer container = new GenericContainer<>(tinyContainerDef()) - .withReuse(true) - .withNetwork(network) - ) { - container.start(); + GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); + container.start(); - assertHttpResponseFromHost(container, 1234); + assertHttpResponseFromHost(container, 1234); - PortForwardingContainer.INSTANCE.reset(); - Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); + PortForwardingContainer.INSTANCE.reset(); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); - try ( - GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) - .withReuse(true) - .withNetwork(network) - ) { - reusedContainer.start(); + GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withReuse(true) + .withNetwork(network); + reusedContainer.start(); - assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); - assertHttpResponseFromHost(reusedContainer, 1234); - } - } + assertThat(reusedContainer.getContainerId()).isEqualTo(container.getContainerId()); + assertHttpResponseFromHost(reusedContainer, 1234); + + container.stop(); + reusedContainer.stop(); } @SneakyThrows @@ -185,47 +176,30 @@ private void assertHttpResponseFromHost(GenericContainer container, int port) } private static Network createReusableNetwork(UUID name) { - String id = DockerClientFactory - .instance() - .client() - .listNetworksCmd() - .exec() - .stream() - .filter(network -> { - return ( - network.getName().equals(name.toString()) && - network.getLabels().equals(DockerClientFactory.DEFAULT_LABELS) - ); - }) - .map(com.github.dockerjava.api.model.Network::getId) - .findFirst() - .orElseGet(() -> { - return DockerClientFactory - .instance() - .client() - .createNetworkCmd() - .withName(name.toString()) - .withCheckDuplicate(true) - .withLabels(DockerClientFactory.DEFAULT_LABELS) - .exec() - .getId(); - }); - - return new Network() { + String networkName = name.toString(); + Network network = new Network() { @Override - public Statement apply(Statement base, Description description) { - return base; + public String getId() { + return networkName; } @Override - public String getId() { - return id; - } + public void close() {} @Override - public void close() { - // never close + public Statement apply(Statement base, Description description) { + return null; } }; + + List networks = DockerClientFactory + .lazyClient() + .listNetworksCmd() + .withNameFilter(networkName) + .exec(); + if (networks.isEmpty()) { + Network.builder().createNetworkCmdModifier(cmd -> cmd.withName(networkName)).build().getId(); + } + return network; } } From 16aecea594d663ff0e74795b7b906bc29fa1b2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 6 Nov 2024 19:05:44 -0600 Subject: [PATCH 4/6] Polish --- .../org/testcontainers/containers/ExposedHostTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 588a7644679..d7b37dd2cf0 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -25,8 +25,6 @@ public class ExposedHostTest { private static HttpServer server; - private static Network network; - @BeforeClass public static void setUpClass() throws Exception { server = HttpServer.create(new InetSocketAddress(0), 0); @@ -42,13 +40,11 @@ public static void setUpClass() throws Exception { } ); server.start(); - network = createReusableNetwork(UUID.randomUUID()); } @AfterClass public static void tearDownClass() { server.stop(0); - DockerClientFactory.instance().client().removeNetworkCmd(network.getId()).exec(); } @After @@ -93,6 +89,7 @@ public void testExposedHostPortOnFixedInternalPorts() { @Test public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(server.getAddress().getPort()); GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); @@ -113,11 +110,13 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE container.stop(); reusedContainer.stop(); + DockerClientFactory.lazyClient().removeNetworkCmd(network.getId()).exec(); } @Test public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); @@ -138,6 +137,7 @@ public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetw container.stop(); reusedContainer.stop(); + DockerClientFactory.lazyClient().removeNetworkCmd(network.getId()).exec(); } @SneakyThrows From 56761b1086e99677d23a00e5d009138cbc911fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 6 Nov 2024 19:23:38 -0600 Subject: [PATCH 5/6] Fix tests by adding labels --- .../containers/ExposedHostTest.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index d7b37dd2cf0..9c582f13f63 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -16,7 +16,9 @@ import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -89,10 +91,16 @@ public void testExposedHostPortOnFixedInternalPorts() { @Test public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + Map labels = new HashMap<>(); + labels.put("exposeHostPorts", "samePorts"); + Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); + GenericContainer container = new GenericContainer<>(tinyContainerDef()) + .withLabels(labels) + .withReuse(true) + .withNetwork(network); container.start(); assertHttpResponseFromHost(container, server.getAddress().getPort()); @@ -101,6 +109,7 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE Testcontainers.exposeHostPorts(server.getAddress().getPort()); GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withLabels(labels) .withReuse(true) .withNetwork(network); reusedContainer.start(); @@ -116,10 +125,16 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE @Test public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + Map labels = new HashMap<>(); + labels.put("exposeHostPorts", "differentPorts"); + Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); - GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); + GenericContainer container = new GenericContainer<>(tinyContainerDef()) + .withLabels(labels) + .withReuse(true) + .withNetwork(network); container.start(); assertHttpResponseFromHost(container, 1234); @@ -128,6 +143,7 @@ public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetw Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) + .withLabels(labels) .withReuse(true) .withNetwork(network); reusedContainer.start(); From f301f56616fee96e9a7dd633e7c75efa37fe7287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 6 Nov 2024 19:34:46 -0600 Subject: [PATCH 6/6] Use assumption --- .../containers/ExposedHostTest.java | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 9c582f13f63..4ce316fcf80 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -12,16 +12,16 @@ import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; import org.testcontainers.Testcontainers; +import org.testcontainers.utility.TestcontainersConfiguration; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assumptions.assumeThat; public class ExposedHostTest { @@ -91,16 +91,11 @@ public void testExposedHostPortOnFixedInternalPorts() { @Test public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { - Map labels = new HashMap<>(); - labels.put("exposeHostPorts", "samePorts"); - + assumeThat(TestcontainersConfiguration.getInstance().environmentSupportsReuse()).isTrue(); Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - GenericContainer container = new GenericContainer<>(tinyContainerDef()) - .withLabels(labels) - .withReuse(true) - .withNetwork(network); + GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); container.start(); assertHttpResponseFromHost(container, server.getAddress().getPort()); @@ -109,7 +104,6 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE Testcontainers.exposeHostPorts(server.getAddress().getPort()); GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) - .withLabels(labels) .withReuse(true) .withNetwork(network); reusedContainer.start(); @@ -125,16 +119,11 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE @Test public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { - Map labels = new HashMap<>(); - labels.put("exposeHostPorts", "differentPorts"); - + assumeThat(TestcontainersConfiguration.getInstance().environmentSupportsReuse()).isTrue(); Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); - GenericContainer container = new GenericContainer<>(tinyContainerDef()) - .withLabels(labels) - .withReuse(true) - .withNetwork(network); + GenericContainer container = new GenericContainer<>(tinyContainerDef()).withReuse(true).withNetwork(network); container.start(); assertHttpResponseFromHost(container, 1234); @@ -143,7 +132,6 @@ public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetw Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 1234)); GenericContainer reusedContainer = new GenericContainer<>(tinyContainerDef()) - .withLabels(labels) .withReuse(true) .withNetwork(network); reusedContainer.start();