refactor: extract runtime-specific code into src/container-runtime.ts (#321)
Move all container-runtime-specific logic (binary name, mount args, stop command, startup check, orphan cleanup) into a single file so swapping runtimes only requires replacing this one file. Neutralize "Apple Container" references in comments and docs that would become incorrect after a runtime swap. References that list both runtimes as options are left unchanged. No behavior change — Apple Container remains the default runtime. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,7 @@ Host (macOS) Container (Linux VM)
|
||||
─────────────────────────────────────────────────────────────
|
||||
src/container-runner.ts container/agent-runner/
|
||||
│ │
|
||||
│ spawns Apple Container │ runs Claude Agent SDK
|
||||
│ spawns container │ runs Claude Agent SDK
|
||||
│ with volume mounts │ with MCP servers
|
||||
│ │
|
||||
├── data/env/env ──────────────> /workspace/env-dir/env
|
||||
@@ -80,7 +80,7 @@ cat .env # Should show one of:
|
||||
|
||||
### 2. Environment Variables Not Passing
|
||||
|
||||
**Apple Container Bug:** Environment variables passed via `-e` are lost when using `-i` (interactive/piped stdin).
|
||||
**Runtime note:** Environment variables passed via `-e` may be lost when using `-i` (interactive/piped stdin).
|
||||
|
||||
**Workaround:** The system extracts only authentication variables (`CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY`) from `.env` and mounts them for sourcing inside the container. Other env vars are not exposed.
|
||||
|
||||
@@ -94,9 +94,9 @@ echo '{}' | container run -i \
|
||||
|
||||
### 3. Mount Issues
|
||||
|
||||
**Apple Container quirks:**
|
||||
**Container mount notes:**
|
||||
- Only mounts directories, not individual files
|
||||
- `-v` syntax does NOT support `:ro` suffix - use `--mount` for readonly:
|
||||
- `-v` syntax may NOT support `:ro` suffix - use `--mount` for readonly:
|
||||
```bash
|
||||
# Readonly: use --mount
|
||||
--mount "type=bind,source=/path,target=/container/path,readonly"
|
||||
@@ -326,7 +326,7 @@ echo -e "\n1. Authentication configured?"
|
||||
echo -e "\n2. Env file copied for container?"
|
||||
[ -f data/env/env ] && echo "OK" || echo "MISSING - will be created on first run"
|
||||
|
||||
echo -e "\n3. Apple Container system running?"
|
||||
echo -e "\n3. Container runtime running?"
|
||||
container system status &>/dev/null && echo "OK" || echo "NOT RUNNING - NanoClaw should auto-start it; check logs"
|
||||
|
||||
echo -e "\n4. Container image exists?"
|
||||
|
||||
@@ -207,7 +207,7 @@ Show the log tail command: `tail -f logs/nanoclaw.log`
|
||||
|
||||
**Service not starting:** Check `logs/nanoclaw.error.log`. Common causes: wrong Node path in plist (re-run step 10), missing `.env` (re-run step 4), missing WhatsApp auth (re-run step 5).
|
||||
|
||||
**Container agent fails ("Claude Code process exited with code 1"):** Ensure the container runtime is running — start it: `container system start` (Apple Container) or `open -a Docker` (macOS Docker). Check container logs in `groups/main/logs/container-*.log`.
|
||||
**Container agent fails ("Claude Code process exited with code 1"):** Ensure the container runtime is running — start it with the appropriate command for your runtime. Check container logs in `groups/main/logs/container-*.log`.
|
||||
|
||||
**No response to messages:** Verify the trigger pattern matches. Main channel and personal/solo chats don't need a prefix. Check the registered JID in the database: `sqlite3 store/messages.db "SELECT * FROM registered_groups"`. Check `logs/nanoclaw.log`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user