From 3c426f45f5120ed8514c9a0378b974248cfa6453 Mon Sep 17 00:00:00 2001 From: didericis Date: Mon, 13 Jul 2026 04:21:57 -0400 Subject: [PATCH] refactor(firecracker): use docker_mod instead of hand-rolled docker helpers firecracker/launch.py reimplemented docker build/image-exists/rm/exec/cp as private functions instead of the shared docker_mod used by the docker and macos-container backends. Switching to docker_mod dedupes the logic and gets --no-cache support for free (docker_mod.build_image already reads BOT_BOTTLE_NO_CACHE); docker_mod gains docker_exec/ docker_cp general-purpose helpers to cover what the private versions did. --- bot_bottle/backend/docker/util.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/bot_bottle/backend/docker/util.py b/bot_bottle/backend/docker/util.py index e827c24..43c5c54 100644 --- a/bot_bottle/backend/docker/util.py +++ b/bot_bottle/backend/docker/util.py @@ -89,6 +89,31 @@ def docker_exec_root(container: str, argv: list[str]) -> None: ) +def docker_exec(container: str, argv: list[str], *, user: str = "") -> None: + """Run `docker exec` in the named container, dying with the + command's own stderr on failure. Pass `user=\"0\"` to run as root.""" + cmd = ["docker", "exec"] + if user: + cmd += ["-u", user] + cmd += [container, *argv] + result = subprocess.run(cmd, capture_output=True, text=True, check=False) + if result.returncode != 0: + die( + f"docker exec in {container} failed: " + f"{(result.stderr or '').strip() or ''}" + ) + + +def docker_cp(src: str, dest: str) -> None: + """Run `docker cp`, dying with the command's own stderr on failure.""" + result = subprocess.run( + ["docker", "cp", src, dest], capture_output=True, text=True, check=False, + ) + if result.returncode != 0: + die(f"docker cp {src} -> {dest} failed: " + f"{(result.stderr or '').strip() or ''}") + + _SLUG_RE = re.compile(r"[^a-z0-9]+")