Align the docs with the reorganized project layout so container setup commands match the paths users actually run. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
5.3 KiB
5.3 KiB
host-git-cred-proxy
让 Docker 容器复用宿主机现有的 Git HTTPS 凭证。
适用场景:
- macOS + OrbStack / Docker Desktop
- 容器里使用
https://...Git remote - 宿主机已经能通过自己的
git credential正常取到凭证
工作方式:
- 宿主机启动一个只监听
127.0.0.1的代理服务 - 代理服务内部调用宿主机自己的
git credential fill/approve/reject - 容器里的 Git helper 把 Git 的凭证请求转发到宿主机代理
这意味着它代理的是“宿主机 Git 当前能取到的 HTTPS 凭证”,不是 macOS 全部系统密码。
目录结构
host/:只在宿主机运行container/:只在容器里运行examples/:接入示例host/state/:运行时状态目录,存 token、pid、日志
当前结构:
host-git-cred-proxy/
├── host/
│ ├── server.mjs
│ ├── start.sh
│ ├── status.sh
│ ├── stop.sh
│ └── state/
├── container/
│ ├── configure-git.sh
│ ├── git-credential-hostproxy
│ └── helper.mjs
├── examples/
│ ├── devcontainer.json
│ └── docker-compose.yml
├── package.json
└── README.md
默认行为
- 默认代理所有
httpsGit 凭证 - 默认监听
127.0.0.1:18765 - 容器默认通过
http://host.docker.internal:18765访问宿主机 - token 生成到
./host/state/token
如果你还要代理 http 仓库:
GIT_CRED_PROXY_PROTOCOLS=https,http ./host/start.sh
使用
1. 宿主机启动代理
在宿主机进入这个项目目录:
./host/start.sh
查看状态:
./host/status.sh
2. 确保容器能访问这个项目目录
容器里的 Git helper 会直接引用这个项目目录下的脚本和 host/state/token。
所以你需要保证这个目录也能在容器里看到,例如:
- 宿主机和容器都共享
/workspaces - 或者把这个目录单独挂载到容器内
3. 容器里配置 Git helper
如果你当前就在挂载后的 host-git-cred-proxy 项目根目录,直接执行:
./container/configure-git.sh
如果你想只作用于当前仓库:
cd /path/to/your/repo
/path/to/host-git-cred-proxy/container/configure-git.sh --local
或者显式指定仓库:
/path/to/host-git-cred-proxy/container/configure-git.sh --local --repo /path/to/your-repo
如果这个项目在容器里不是当前目录,而是挂载在固定位置,例如 /opt/host-git-cred-proxy,那就执行:
/opt/host-git-cred-proxy/container/configure-git.sh
4. 验证
git ls-remote origin
或者:
printf 'protocol=https\nhost=example.com\npath=owner/repo.git\n\n' | git credential fill
接入示例
这两个示例都假设你已经在宿主机启动了代理:
./host/start.sh
docker-compose
示例文件:examples/docker-compose.yml
使用前先设置宿主机项目路径:
export HOST_GIT_CRED_PROXY_DIR=/workspaces/host-git-cred-proxy
然后把示例复制到你的项目里:
cp /workspaces/host-git-cred-proxy/examples/docker-compose.yml ./docker-compose.yml
docker compose up -d
这个示例会:
- 把当前项目挂到容器内的
/workspace - 把
host-git-cred-proxy挂到容器内的/opt/host-git-cred-proxy - 容器启动时自动执行
/opt/host-git-cred-proxy/container/configure-git.sh --global
如果你在 OrbStack 里用 network_mode: host,也可以把 GIT_CRED_PROXY_URL 改成:
http://localhost:18765
devcontainer
示例文件:examples/devcontainer.json
先在宿主机设置:
export HOST_GIT_CRED_PROXY_DIR=/workspaces/host-git-cred-proxy
然后复制到你的项目:
mkdir -p .devcontainer
cp /workspaces/host-git-cred-proxy/examples/devcontainer.json .devcontainer/devcontainer.json
这个示例会:
- 把当前工作区挂到容器内的
/workspace - 额外挂载
host-git-cred-proxy到/opt/host-git-cred-proxy - 在容器创建完成后自动执行
/opt/host-git-cred-proxy/container/configure-git.sh --global
如果你的本地路径不是 /workspaces/host-git-cred-proxy,只要把 HOST_GIT_CRED_PROXY_DIR 换成真实绝对路径即可。
可选环境变量
GIT_CRED_PROXY_HOST:宿主机监听地址,默认127.0.0.1GIT_CRED_PROXY_PORT:宿主机监听端口,默认18765GIT_CRED_PROXY_PUBLIC_URL:容器访问地址,默认http://host.docker.internal:<port>GIT_CRED_PROXY_PROTOCOLS:允许代理的协议列表,默认httpsGIT_CRED_PROXY_ALLOWED_HOSTS:可选,限制允许代理的 host,逗号分隔GIT_CRED_PROXY_URL:容器 helper 访问代理的地址,默认http://host.docker.internal:18765GIT_CRED_PROXY_TOKEN:可选,直接传 token,优先于 token 文件GIT_CRED_PROXY_TOKEN_FILE:可选,自定义 token 文件路径GIT_CRED_PROXY_RUNTIME:可选,显式指定bun或node
安全说明
- 服务端默认只监听
127.0.0.1 - token 存在
host/state/下,并通过.gitignore忽略 - 只要容器能读取这个目录,也就能读取 token
- 这适合你信任当前容器的开发场景,不适合不可信容器或多租户环境
停止代理
./host/stop.sh