Skip to content

Commit d908abf

Browse files
committed
address second round of review feedback
- docker rm without -f to avoid killing running containers on transient failures - use _DOCKER_TIMEOUT constant for docker run - assert full docker inspect argv in reuse test
1 parent b646bea commit d908abf

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

src/seclab_taskflows/mcp_servers/container_shell.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,24 @@ def _is_running(name: str) -> bool:
6767

6868

6969
def _remove_container(name: str) -> None:
70-
"""Remove a stopped container by name. Logs failures for diagnostics."""
70+
"""Remove a stopped container by name. Logs failures for diagnostics.
71+
72+
Uses ``docker rm`` (without -f) so that running containers are NOT
73+
killed — only genuinely stopped leftovers are cleaned up.
74+
"""
7175
try:
7276
result = subprocess.run(
73-
["docker", "rm", "-f", name],
77+
["docker", "rm", name],
7478
capture_output=True,
7579
text=True,
7680
timeout=_DOCKER_TIMEOUT,
7781
)
7882
if result.returncode != 0:
79-
logging.warning(
80-
"docker rm -f failed for %s: %s", name, result.stderr.strip()
83+
logging.debug(
84+
"docker rm skipped for %s: %s", name, result.stderr.strip()
8185
)
8286
except subprocess.TimeoutExpired:
83-
logging.error("docker rm -f timed out for %s after %ds", name, _DOCKER_TIMEOUT)
87+
logging.error("docker rm timed out for %s after %ds", name, _DOCKER_TIMEOUT)
8488

8589

8690
def _start_container() -> str:
@@ -109,7 +113,7 @@ def _start_container() -> str:
109113
cmd += ["-v", f"{CONTAINER_WORKSPACE}:/workspace"]
110114
cmd += [CONTAINER_IMAGE, "tail", "-f", "/dev/null"]
111115
logging.debug(f"Starting container: {' '.join(cmd)}")
112-
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
116+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=_DOCKER_TIMEOUT)
113117
if result.returncode != 0:
114118
msg = f"docker run failed: {result.stderr.strip()}"
115119
raise RuntimeError(msg)

tests/test_container_shell.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ def test_start_reuses_running_persistent_container(self):
235235
assert name.startswith("seclab-persist-")
236236
# Only docker inspect should be called, NOT docker run
237237
assert mock_run.call_count == 1
238-
assert "inspect" in mock_run.call_args[0][0]
238+
cmd = mock_run.call_args[0][0]
239+
assert cmd == ["docker", "inspect", "--format", "json", name]
239240

240241
def test_start_persistent_no_rm_flag(self):
241242
inspect_proc = _make_proc(
@@ -269,9 +270,9 @@ def test_stop_skips_persistent_container(self):
269270

270271
def test_remove_container_logs_failure(self):
271272
with patch("subprocess.run", return_value=_make_proc(returncode=1, stderr="conflict")):
272-
with patch.object(cs_mod.logging, "warning") as mock_warn:
273+
with patch.object(cs_mod.logging, "debug") as mock_debug:
273274
cs_mod._remove_container("test-name")
274-
mock_warn.assert_called_once()
275+
mock_debug.assert_called_once()
275276

276277
def test_remove_container_logs_timeout(self):
277278
with patch("subprocess.run", side_effect=subprocess.TimeoutExpired(cmd="docker", timeout=30)):

0 commit comments

Comments
 (0)