fix(macos_container): mount supervise db's parent dir, not the file
Apple's `container run --mount type=bind` only accepts directory sources — a file source fails with "path '<file>' is not a directory". Move the sqlite db into its own ~/.bot-bottle/db/ subdirectory so it can be bind-mounted the same way the CA/routes mounts already are, without exposing the rest of ~/.bot-bottle. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -405,7 +405,15 @@ def _sidecar_mounts(
|
|||||||
|
|
||||||
sp = plan.supervise_plan
|
sp = plan.supervise_plan
|
||||||
if sp is not None:
|
if sp is not None:
|
||||||
mounts.append((str(sp.db_path), DB_PATH_IN_CONTAINER, False))
|
# `container run --mount type=bind` only accepts directory
|
||||||
|
# sources (a file source fails with "is not a directory") —
|
||||||
|
# mount db_path's dedicated parent dir instead of the file
|
||||||
|
# itself, same as the CA/routes mounts above.
|
||||||
|
mounts.append((
|
||||||
|
str(sp.db_path.parent),
|
||||||
|
str(Path(DB_PATH_IN_CONTAINER).parent),
|
||||||
|
False,
|
||||||
|
))
|
||||||
|
|
||||||
return tuple(mounts)
|
return tuple(mounts)
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,10 @@ def host_db_path() -> Path:
|
|||||||
# Calls bot_bottle_root() through this module's globals so that patches
|
# Calls bot_bottle_root() through this module's globals so that patches
|
||||||
# on supervise.bot_bottle_root propagate to callers going through
|
# on supervise.bot_bottle_root propagate to callers going through
|
||||||
# supervise.host_db_path().
|
# supervise.host_db_path().
|
||||||
return bot_bottle_root() / HOST_DB_FILENAME
|
#
|
||||||
|
# Kept in its own "db" subdirectory (see supervise_types.host_db_path
|
||||||
|
# for why) — must stay in sync with that copy.
|
||||||
|
return bot_bottle_root() / "db" / HOST_DB_FILENAME
|
||||||
|
|
||||||
|
|
||||||
def audit_log_path(component: str, slug: str) -> Path:
|
def audit_log_path(component: str, slug: str) -> Path:
|
||||||
|
|||||||
@@ -50,7 +50,14 @@ def bot_bottle_root() -> Path:
|
|||||||
def host_db_path() -> Path:
|
def host_db_path() -> Path:
|
||||||
# Look up bot_bottle_root through this module's live namespace so that
|
# Look up bot_bottle_root through this module's live namespace so that
|
||||||
# monkey-patches on supervise_types.bot_bottle_root take effect.
|
# monkey-patches on supervise_types.bot_bottle_root take effect.
|
||||||
return sys.modules[__name__].bot_bottle_root() / HOST_DB_FILENAME
|
#
|
||||||
|
# Lives in its own "db" subdirectory, not directly under
|
||||||
|
# bot_bottle_root(), so backends that can only bind-mount
|
||||||
|
# directories (macos_container's `container run --mount`, which
|
||||||
|
# rejects file sources with "is not a directory") can share this
|
||||||
|
# one file with a sidecar without also exposing bot_bottle_root()'s
|
||||||
|
# other contents (git-gate keys, per-bottle state, etc.).
|
||||||
|
return sys.modules[__name__].bot_bottle_root() / "db" / HOST_DB_FILENAME
|
||||||
|
|
||||||
|
|
||||||
def _require_str(raw: dict[str, object], key: str) -> str:
|
def _require_str(raw: dict[str, object], key: str) -> str:
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ class TestMacosContainerLaunchArgv(unittest.TestCase):
|
|||||||
argv,
|
argv,
|
||||||
)
|
)
|
||||||
self.assertIn(
|
self.assertIn(
|
||||||
"type=bind,source=/state/bot-bottle.db,target=/run/supervise/bot-bottle.db",
|
"type=bind,source=/state,target=/run/supervise",
|
||||||
argv,
|
argv,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user