Skip to content

Commit 83d9a99

Browse files
authored
fix: limit docker hostname to 32 characters (#378)
1 parent 9ef5aa8 commit 83d9a99

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

nemo_run/core/execution/docker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ def run(self, client: "DockerClient", id: str) -> "Container":
290290
detach=True,
291291
remove=True,
292292
name=self.name,
293-
hostname=self.name,
293+
hostname=self.name[-32:],
294294
network=self.executor.network,
295295
working_dir=f"/{RUNDIR_NAME}/code",
296296
labels={

test/core/execution/test_docker.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,80 @@ def test_delete_error(self, mock_docker_client, mock_container):
404404
container.get_container.assert_called_once_with(client=mock_docker_client, id="job123")
405405
mock_container.remove.assert_called_once_with(force=True)
406406

407+
@patch("nemo_run.core.execution.docker.ensure_network")
408+
def test_run_with_short_container_name(self, mock_ensure_network, mock_docker_client):
409+
"""Test run method with container name <= 32 characters."""
410+
executor = DockerExecutor(container_image="test:latest")
411+
executor.experiment_id = "exp123"
412+
413+
container = DockerContainer(
414+
name="short-name",
415+
command=["python", "script.py"],
416+
executor=executor,
417+
extra_env={},
418+
)
419+
420+
mock_docker_client.containers.run.return_value = MagicMock()
421+
422+
container.run(mock_docker_client, "job123")
423+
424+
# Verify hostname is set to the full name
425+
call_kwargs = mock_docker_client.containers.run.call_args[1]
426+
assert call_kwargs["hostname"] == "short-name"
427+
assert len(call_kwargs["hostname"]) <= 32
428+
429+
@patch("nemo_run.core.execution.docker.ensure_network")
430+
def test_run_with_long_container_name(self, mock_ensure_network, mock_docker_client):
431+
"""Test run method with container name > 32 characters."""
432+
executor = DockerExecutor(container_image="test:latest")
433+
executor.experiment_id = "exp123"
434+
435+
# Create a name that's longer than 32 characters
436+
long_name = "this-is-a-very-long-container-name-that-exceeds-thirty-two-characters"
437+
assert len(long_name) > 32
438+
439+
container = DockerContainer(
440+
name=long_name,
441+
command=["python", "script.py"],
442+
executor=executor,
443+
extra_env={},
444+
)
445+
446+
mock_docker_client.containers.run.return_value = MagicMock()
447+
448+
container.run(mock_docker_client, "job123")
449+
450+
# Verify hostname is truncated to last 32 characters
451+
call_kwargs = mock_docker_client.containers.run.call_args[1]
452+
assert call_kwargs["hostname"] == long_name[-32:]
453+
assert len(call_kwargs["hostname"]) == 32
454+
455+
@patch("nemo_run.core.execution.docker.ensure_network")
456+
def test_run_with_exactly_32_char_name(self, mock_ensure_network, mock_docker_client):
457+
"""Test run method with container name exactly 32 characters."""
458+
executor = DockerExecutor(container_image="test:latest")
459+
executor.experiment_id = "exp123"
460+
461+
# Create a name that's exactly 32 characters
462+
exact_name = "a" * 32
463+
assert len(exact_name) == 32
464+
465+
container = DockerContainer(
466+
name=exact_name,
467+
command=["python", "script.py"],
468+
executor=executor,
469+
extra_env={},
470+
)
471+
472+
mock_docker_client.containers.run.return_value = MagicMock()
473+
474+
container.run(mock_docker_client, "job123")
475+
476+
# Verify hostname is set to the full name
477+
call_kwargs = mock_docker_client.containers.run.call_args[1]
478+
assert call_kwargs["hostname"] == exact_name
479+
assert len(call_kwargs["hostname"]) == 32
480+
407481

408482
class TestDockerJobRequest:
409483
def test_init(self, docker_executor):

0 commit comments

Comments
 (0)