fix(plugins): expose host Claude plugins + skills to container

Root cause of '容器里看不到任何 SK':
- Container's /root/.claude was an isolated named volume (empty)
- Host plugins live in ~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/
- installed_plugins.json embeds ABSOLUTE paths like /Users/$USER/.claude/...
  which don't resolve in container

Fix:
1. docker-compose.yml
   - Bind-mount ${HOME}/.claude/plugins -> /root/.claude/plugins (ro)
   - Bind-mount ${HOME}/.claude/skills  -> /root/.claude/skills  (ro)
   - Pass HOST_HOME env var
2. scripts/container-entrypoint.sh (new)
   - If HOST_HOME != HOME, symlink HOST_HOME -> /root so the absolute
     paths inside installed_plugins.json resolve (e.g.
     /Users/gongzhiyong/.claude/... -> /root/.claude/...)
3. Dockerfile
   - Install entrypoint, wire it into ENTRYPOINT via tini

Verified: all 4 installed plugins (oh-my-claudecode, superpowers,
frontend-design, planning-with-files) + 3 skills (agent-browser,
find-skills, omc-reference) visible in container.
This commit is contained in:
gongzhiyong
2026-04-24 23:16:14 +08:00
parent 1277fa91d7
commit ab2ea0730e
3 changed files with 28 additions and 1 deletions
+4 -1
View File
@@ -55,7 +55,10 @@ RUN git config --system --add safe.directory '*' \
&& git config --system pull.rebase false \
&& git config --system init.defaultBranch main
COPY scripts/container-entrypoint.sh /usr/local/bin/container-entrypoint.sh
RUN chmod +x /usr/local/bin/container-entrypoint.sh
WORKDIR /workspace
ENTRYPOINT ["/usr/bin/tini", "--"]
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/container-entrypoint.sh"]
CMD ["claude"]
+6
View File
@@ -24,6 +24,8 @@ services:
GIT_COMMITTER_NAME: ${GIT_AUTHOR_NAME:-Claude Agent}
GIT_COMMITTER_EMAIL: ${GIT_AUTHOR_EMAIL:-claude-agent@local}
TERM: xterm-256color
# 传宿主 HOME 给 entrypoint,让 installed_plugins.json 里的绝对路径可解析
HOST_HOME: ${HOME}
volumes:
# REPOS_DIR 默认指向 ai-ops 的父目录;队友可在 .env 里改成自己的工作目录
- ${REPOS_DIR:-..}/chat-gw:/workspace/chat-gw
@@ -35,6 +37,10 @@ services:
- ./CLAUDE.md:/workspace/CLAUDE.md:ro
- ./.claude:/workspace/.claude
- claude-home:/root/.claude
# 共享宿主 Claude Code 的 plugins + skills(只读)
# 让容器里的 claude 能看到 superpowers / oh-my-claudecode / frontend-design 等
- ${HOME}/.claude/plugins:/root/.claude/plugins:ro
- ${HOME}/.claude/skills:/root/.claude/skills:ro
- pip-cache:/root/.cache/pip
- go-cache:/root/go/pkg
- npm-cache:/root/.npm
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# 容器启动时运行的初始化脚本:
# 1) 如果 HOST_HOME 被传入且与 $HOME 不同,建立 symlink 让绝对路径兼容
# (例:宿主机 /Users/alice/.claude 里的 installed_plugins.json 含
# 绝对路径 /Users/alice/.claude/plugins/cache/... —— 需要容器里
# /Users/alice 也能解析到 /root,否则插件加载失败)
# 2) 最后 exec 真实命令
set -euo pipefail
if [[ -n "${HOST_HOME:-}" && "$HOST_HOME" != "$HOME" && "$HOST_HOME" != "/" ]]; then
if [[ ! -e "$HOST_HOME" ]]; then
parent=$(dirname "$HOST_HOME")
mkdir -p "$parent"
ln -sfn "$HOME" "$HOST_HOME"
fi
fi
exec "$@"