diff --git a/core/testcontainers/core/container.py b/core/testcontainers/core/container.py index b5c11818..e31f60dc 100644 --- a/core/testcontainers/core/container.py +++ b/core/testcontainers/core/container.py @@ -28,6 +28,20 @@ class DockerContainer: """ Basic container object to spin up Docker instances. + Args: + image: The name of the image to start. + docker_client_kw: Dictionary with arguments that will be passed to the + docker.DockerClient init. + command: Optional execution command for the container. + name: Optional name for the container. + ports: Ports to be exposed by the container. The port number will be + automatically assigned on the host, use + :code:`get_exposed_port(PORT)` method to get the port number on the host. + volumes: Volumes to mount into the container. Each entry should be a tuple with + three values: host path, container path and. mode (default 'ro'). + network: Optional network to connect the container to. + network_aliases: Optional list of aliases for the container in the network. + .. doctest:: >>> from testcontainers.core.container import DockerContainer @@ -41,18 +55,40 @@ def __init__( self, image: str, docker_client_kw: Optional[dict] = None, + command: Optional[str] = None, + env: Optional[dict[str, str]] = None, + name: Optional[str] = None, + ports: Optional[list[int]] = None, + volumes: Optional[list[tuple[str, str, str]]] = None, + network: Optional[Network] = None, + network_aliases: Optional[list[str]] = None, **kwargs, ) -> None: - self.env = {} + self.env = env or {} + self.ports = {} + if ports: + self.with_exposed_ports(*ports) + self.volumes = {} + if volumes: + for vol in volumes: + self.with_volume_mapping(*vol) + self.image = image self._docker = DockerClient(**(docker_client_kw or {})) self._container = None - self._command = None - self._name = None + self._command = command + self._name = name + self._network: Optional[Network] = None + if network is not None: + self.with_network(network) + self._network_aliases: Optional[list[str]] = None + if network_aliases: + self.with_network_aliases(*network_aliases) + self._kwargs = kwargs def with_env(self, key: str, value: str) -> Self: diff --git a/core/tests/test_container.py b/core/tests/test_container.py index e1e7cff7..bb7dd059 100644 --- a/core/tests/test_container.py +++ b/core/tests/test_container.py @@ -75,3 +75,24 @@ def test_get_exposed_port_original(container: DockerContainer, monkeypatch: pyte monkeypatch.setattr(client, "get_connection_mode", lambda: ConnectionMode.bridge_ip) assert container.get_exposed_port(8080) == 8080 + + +@pytest.mark.parametrize( + "init_attr,init_value,class_attr,stored_value", + [ + ("command", "ps", "_command", "ps"), + ("env", {"e1": "v1"}, "env", {"e1": "v1"}), + ("name", "foo-bar", "_name", "foo-bar"), + ("ports", [22, 80], "ports", {22: None, 80: None}), + ( + "volumes", + [("/tmp", "/tmp2", "ro")], + "volumes", + {"/tmp": {"bind": "/tmp2", "mode": "ro"}}, + ), + ], +) +def test_attribute(init_attr, init_value, class_attr, stored_value): + """Test that the attributes set through the __init__ function are properly stored.""" + with DockerContainer("ubuntu", **{init_attr: init_value}) as container: + assert getattr(container, class_attr) == stored_value