From 969f2677302192e8335b74843c818f0a8981ee51 Mon Sep 17 00:00:00 2001 From: Hemil Desai Date: Thu, 6 Nov 2025 08:24:48 -0800 Subject: [PATCH 1/2] fix: limit docker hostname to 32 characters Signed-off-by: Hemil Desai --- nemo_run/core/execution/docker.py | 2 +- test/core/execution/test_docker.py | 74 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/nemo_run/core/execution/docker.py b/nemo_run/core/execution/docker.py index ec060823..51a964b7 100644 --- a/nemo_run/core/execution/docker.py +++ b/nemo_run/core/execution/docker.py @@ -290,7 +290,7 @@ def run(self, client: "DockerClient", id: str) -> "Container": detach=True, remove=True, name=self.name, - hostname=self.name, + hostname=self.name[:32], network=self.executor.network, working_dir=f"/{RUNDIR_NAME}/code", labels={ diff --git a/test/core/execution/test_docker.py b/test/core/execution/test_docker.py index 52766ce9..64b2203c 100644 --- a/test/core/execution/test_docker.py +++ b/test/core/execution/test_docker.py @@ -404,6 +404,80 @@ def test_delete_error(self, mock_docker_client, mock_container): container.get_container.assert_called_once_with(client=mock_docker_client, id="job123") mock_container.remove.assert_called_once_with(force=True) + @patch("nemo_run.core.execution.docker.ensure_network") + def test_run_with_short_container_name(self, mock_ensure_network, mock_docker_client): + """Test run method with container name <= 32 characters.""" + executor = DockerExecutor(container_image="test:latest") + executor.experiment_id = "exp123" + + container = DockerContainer( + name="short-name", + command=["python", "script.py"], + executor=executor, + extra_env={}, + ) + + mock_docker_client.containers.run.return_value = MagicMock() + + container.run(mock_docker_client, "job123") + + # Verify hostname is set to the full name + call_kwargs = mock_docker_client.containers.run.call_args[1] + assert call_kwargs["hostname"] == "short-name" + assert len(call_kwargs["hostname"]) <= 32 + + @patch("nemo_run.core.execution.docker.ensure_network") + def test_run_with_long_container_name(self, mock_ensure_network, mock_docker_client): + """Test run method with container name > 32 characters.""" + executor = DockerExecutor(container_image="test:latest") + executor.experiment_id = "exp123" + + # Create a name that's longer than 32 characters + long_name = "this-is-a-very-long-container-name-that-exceeds-thirty-two-characters" + assert len(long_name) > 32 + + container = DockerContainer( + name=long_name, + command=["python", "script.py"], + executor=executor, + extra_env={}, + ) + + mock_docker_client.containers.run.return_value = MagicMock() + + container.run(mock_docker_client, "job123") + + # Verify hostname is truncated to 32 characters + call_kwargs = mock_docker_client.containers.run.call_args[1] + assert call_kwargs["hostname"] == long_name[:32] + assert len(call_kwargs["hostname"]) == 32 + + @patch("nemo_run.core.execution.docker.ensure_network") + def test_run_with_exactly_32_char_name(self, mock_ensure_network, mock_docker_client): + """Test run method with container name exactly 32 characters.""" + executor = DockerExecutor(container_image="test:latest") + executor.experiment_id = "exp123" + + # Create a name that's exactly 32 characters + exact_name = "a" * 32 + assert len(exact_name) == 32 + + container = DockerContainer( + name=exact_name, + command=["python", "script.py"], + executor=executor, + extra_env={}, + ) + + mock_docker_client.containers.run.return_value = MagicMock() + + container.run(mock_docker_client, "job123") + + # Verify hostname is set to the full name + call_kwargs = mock_docker_client.containers.run.call_args[1] + assert call_kwargs["hostname"] == exact_name + assert len(call_kwargs["hostname"]) == 32 + class TestDockerJobRequest: def test_init(self, docker_executor): From 77b082695126aecaafa4a5c057ef9c42edd49f34 Mon Sep 17 00:00:00 2001 From: Hemil Desai Date: Thu, 6 Nov 2025 08:30:14 -0800 Subject: [PATCH 2/2] fix Signed-off-by: Hemil Desai --- nemo_run/core/execution/docker.py | 2 +- test/core/execution/test_docker.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nemo_run/core/execution/docker.py b/nemo_run/core/execution/docker.py index 51a964b7..14d9774c 100644 --- a/nemo_run/core/execution/docker.py +++ b/nemo_run/core/execution/docker.py @@ -290,7 +290,7 @@ def run(self, client: "DockerClient", id: str) -> "Container": detach=True, remove=True, name=self.name, - hostname=self.name[:32], + hostname=self.name[-32:], network=self.executor.network, working_dir=f"/{RUNDIR_NAME}/code", labels={ diff --git a/test/core/execution/test_docker.py b/test/core/execution/test_docker.py index 64b2203c..dc71de57 100644 --- a/test/core/execution/test_docker.py +++ b/test/core/execution/test_docker.py @@ -447,9 +447,9 @@ def test_run_with_long_container_name(self, mock_ensure_network, mock_docker_cli container.run(mock_docker_client, "job123") - # Verify hostname is truncated to 32 characters + # Verify hostname is truncated to last 32 characters call_kwargs = mock_docker_client.containers.run.call_args[1] - assert call_kwargs["hostname"] == long_name[:32] + assert call_kwargs["hostname"] == long_name[-32:] assert len(call_kwargs["hostname"]) == 32 @patch("nemo_run.core.execution.docker.ensure_network")