From 5da2b47f725c8e4b3a64fed7fb60e2c1c5e77334 Mon Sep 17 00:00:00 2001 From: didericis Date: Tue, 12 May 2026 10:58:05 -0400 Subject: [PATCH] refactor(docker): move force_remove_container into the docker util module The helper is a thin subprocess wrapper over `container_exists` + `docker rm -f`, so it belongs alongside the other docker primitives in util.py rather than as a private in launch.py. Co-Authored-By: Claude Opus 4.7 --- claude_bottle/backend/docker/launch.py | 10 +--------- claude_bottle/backend/docker/util.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/claude_bottle/backend/docker/launch.py b/claude_bottle/backend/docker/launch.py index b427ed2..45ad6dd 100644 --- a/claude_bottle/backend/docker/launch.py +++ b/claude_bottle/backend/docker/launch.py @@ -72,7 +72,7 @@ def launch( stack.callback(proxy.stop, pipelock_name) container = _run_agent_container(plan, internal_network) - stack.callback(_force_remove_container, container) + stack.callback(docker_mod.force_remove_container, container) prompt_path = provision(plan, container) @@ -135,11 +135,3 @@ def _run_agent_container(plan: DockerBottlePlan, internal_network: str) -> str: ) -def _force_remove_container(name: str) -> None: - if docker_mod.container_exists(name): - subprocess.run( - ["docker", "rm", "-f", name], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - check=False, - ) diff --git a/claude_bottle/backend/docker/util.py b/claude_bottle/backend/docker/util.py index 1b65d46..87ada4e 100644 --- a/claude_bottle/backend/docker/util.py +++ b/claude_bottle/backend/docker/util.py @@ -64,6 +64,19 @@ def container_exists(name: str) -> bool: return bool(result.stdout.strip()) +def force_remove_container(name: str) -> None: + """`docker rm -f` the named container if it exists. No-op if it + doesn't — and the rm itself is best-effort (errors swallowed) so + this is safe to register as a teardown callback.""" + if container_exists(name): + subprocess.run( + ["docker", "rm", "-f", name], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=False, + ) + + def docker_exec_root(container: str, argv: list[str]) -> None: """Run `docker exec -u 0` in the named container, check=True. Used by SSH provisioning to chown/chmod files that need root."""