From 4da4babcf4d740354cd9c66190e7636161f696b9 Mon Sep 17 00:00:00 2001 From: claude Date: Mon, 8 Jun 2026 17:47:34 +0000 Subject: [PATCH] fix: fall back to provider's bundled Dockerfile when manifest doesn't override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BottleBackend.prepare was calling resolve_manifest_dockerfile("", spec) for every bottle where the manifest did not set agent_provider.dockerfile. That resolves an empty string against user_cwd, returning the cwd itself — which docker then tried to read as a Dockerfile, giving "is a directory" errors during image build. When the manifest doesn't override, use the provider plugin's bundled Dockerfile path (next to its agent_provider.py module) — mirroring the pre-refactor behavior. --- bot_bottle/backend/__init__.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bot_bottle/backend/__init__.py b/bot_bottle/backend/__init__.py index e6cd7a8..8c50193 100644 --- a/bot_bottle/backend/__init__.py +++ b/bot_bottle/backend/__init__.py @@ -298,7 +298,15 @@ class BottleBackend(ABC, Generic[PlanT, CleanupT]): slug = mint_slug(spec) write_launch_metadata(slug, spec, compose_project="", backend="smolmachines") - agent_dockerfile_path = resolve_manifest_dockerfile(manfiest_agent_provider.dockerfile, spec) + # Manifest may override the Dockerfile per-bottle; otherwise fall + # back to the provider plugin's bundled Dockerfile (next to its + # agent_provider.py module). + if manfiest_agent_provider.dockerfile: + agent_dockerfile_path = resolve_manifest_dockerfile( + manfiest_agent_provider.dockerfile, spec, + ) + else: + agent_dockerfile_path = str(agent_provider.dockerfile) instance_name = f"bot-bottle-{slug}" agent_dir, prompt_file = prepare_agent_state_dir(slug, spec)