Skip to content

Commit d5de0aa

Browse files
authored
feat: refactor network setup (#678)
fixes #645 - network should be attached as the container is started, not as a post-start action. This will make sure port binding and exposing works correctly. --------- Signed-off-by: mgorsk1 <[email protected]>
1 parent 1e43923 commit d5de0aa

File tree

2 files changed

+48
-22
lines changed

2 files changed

+48
-22
lines changed

core/testcontainers/core/container.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from typing import TYPE_CHECKING, Optional
55

66
import docker.errors
7+
from docker import version
8+
from docker.types import EndpointConfig
79
from typing_extensions import Self
810

911
from testcontainers.core.config import testcontainers_config as c
@@ -88,6 +90,18 @@ def start(self) -> Self:
8890
logger.info("Pulling image %s", self.image)
8991
docker_client = self.get_docker_client()
9092
self._configure()
93+
94+
network_kwargs = (
95+
{
96+
"network": self._network.name,
97+
"networking_config": {
98+
self._network.name: EndpointConfig(version.__version__, aliases=self._network_aliases)
99+
},
100+
}
101+
if self._network
102+
else {}
103+
)
104+
91105
self._container = docker_client.run(
92106
self.image,
93107
command=self._command,
@@ -96,11 +110,11 @@ def start(self) -> Self:
96110
ports=self.ports,
97111
name=self._name,
98112
volumes=self.volumes,
113+
**network_kwargs,
99114
**self._kwargs,
100115
)
116+
101117
logger.info("Container started: %s", self._container.short_id)
102-
if self._network:
103-
self._network.connect(self._container.id, self._network_aliases)
104118
return self
105119

106120
def stop(self, force=True, delete_volume=True) -> None:

core/tests/test_network.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,26 +45,32 @@ def test_network_create_errors():
4545

4646

4747
def test_containers_can_communicate_over_network():
48-
with Network() as network:
49-
with (
50-
DockerContainer(NGINX_ALPINE_SLIM_IMAGE)
51-
.with_name("alpine1")
52-
.with_network_aliases("alpine1-alias-1", "alpine1-alias-2")
53-
.with_network(network) as alpine1
54-
):
55-
with (
56-
DockerContainer(NGINX_ALPINE_SLIM_IMAGE)
57-
.with_name("alpine2")
58-
.with_network_aliases("alpine2-alias-1", "alpine2-alias-2")
59-
.with_network(network) as alpine2
60-
):
61-
assert_can_ping(alpine1, "alpine2")
62-
assert_can_ping(alpine1, "alpine2-alias-1")
63-
assert_can_ping(alpine1, "alpine2-alias-2")
64-
65-
assert_can_ping(alpine2, "alpine1")
66-
assert_can_ping(alpine2, "alpine1-alias-1")
67-
assert_can_ping(alpine2, "alpine1-alias-2")
48+
with (
49+
Network() as network,
50+
DockerContainer(NGINX_ALPINE_SLIM_IMAGE)
51+
.with_name("alpine1")
52+
.with_network_aliases("alpine1-alias-1", "alpine1-alias-2")
53+
.with_network(network) as alpine1,
54+
DockerContainer(NGINX_ALPINE_SLIM_IMAGE)
55+
.with_name("alpine2")
56+
.with_network_aliases("alpine2-alias-1", "alpine2-alias-2")
57+
.with_network(network) as alpine2,
58+
):
59+
assert_can_ping(alpine1, "alpine2")
60+
assert_can_ping(alpine1, "alpine2-alias-1")
61+
assert_can_ping(alpine1, "alpine2-alias-2")
62+
63+
assert_can_ping(alpine2, "alpine1")
64+
assert_can_ping(alpine2, "alpine1-alias-1")
65+
assert_can_ping(alpine2, "alpine1-alias-2")
66+
67+
assert_can_request(alpine1, "alpine2")
68+
assert_can_request(alpine1, "alpine2-alias-1")
69+
assert_can_request(alpine1, "alpine2-alias-2")
70+
71+
assert_can_request(alpine2, "alpine1")
72+
assert_can_request(alpine2, "alpine1-alias-1")
73+
assert_can_request(alpine2, "alpine1-alias-2")
6874

6975

7076
def assert_can_ping(container: DockerContainer, remote_name: str):
@@ -73,6 +79,12 @@ def assert_can_ping(container: DockerContainer, remote_name: str):
7379
assert "64 bytes" in str(output)
7480

7581

82+
def assert_can_request(container: DockerContainer, remote_name: str):
83+
status, output = container.exec(f"wget -qO- http://{remote_name}")
84+
assert status == 0
85+
assert "Welcome to nginx!" in output.decode()
86+
87+
7688
def test_network_has_labels():
7789
network = Network()
7890
try:

0 commit comments

Comments
 (0)