Docker 部署 copilot2api:把 GitHub Copilot 转成兼容 API
whtsky/copilot2api 是一个本地代理,可把 GitHub Copilot 暴露为 OpenAI、OpenAI Responses、Anthropic、Gemini 和 AmpCode 兼容接口。本文固定使用 v0.6.1,正式部署采用 Docker Compose;预编译二进制作为不使用 Docker 时的备选方案。
项目没有实现 API Key 校验。本文只监听 127.0.0.1,适用于同一台机器上的 Codex、Claude Code、Gemini CLI 或其他客户端,不适合作为公网 API 服务。
部署结论
| 项目 | 本文采用的值 |
|---|---|
| GitHub 地址 | whtsky/copilot2api |
| 官方镜像 | ghcr.io/whtsky/copilot2api:0.6.1 |
| 项目版本 | v0.6.1,发布于 2026-08-21 |
| 正式部署 | Docker Compose,单容器 |
| 快速体验 | 不提供临时单命令体验:首次运行必须完成 OAuth,且凭据需要持久化 |
| 主机架构 | Linux amd64、arm64;二进制另支持 macOS 和 Windows |
| 对外端口 | 127.0.0.1:7777:7777 |
| 持久化 | copilot2api-data -> /root/.config/copilot2api |
| 依赖服务 | 无数据库、缓存或队列 |
| 验证范围 | 官方资料核对 + Compose 静态校验;未拉取镜像、未执行 OAuth 或运行容器 |
| 资料核对日期 | 2026-08-26 |
准备条件
- 一个有效的 GitHub Copilot 订阅;个人、Business 或 Enterprise 的可用模型由账号实际返回的模型目录决定。
- 已安装 Docker Engine 或 Docker Desktop,并支持 Compose v2。
- 本机
7777端口未被占用。
docker --version
docker compose version本文使用的镜像同时发布了 Linux amd64 和 arm64 版本。项目未给出最低 CPU、内存或磁盘要求,因此不在这里虚构资源下限。
Docker Compose 正式部署
1. 创建目录
mkdir -p "$HOME/apps/copilot2api"
cd "$HOME/apps/copilot2api"创建 compose.yaml:
services:
copilot2api:
image: ghcr.io/whtsky/copilot2api:0.6.1
container_name: copilot2api
restart: unless-stopped
stdin_open: true
tty: true
ports:
- "127.0.0.1:7777:7777"
volumes:
- copilot2api-data:/root/.config/copilot2api
volumes:
copilot2api-data:
name: copilot2api-datastdin_open 和 tty 对应官方首次运行示例中的 -it。固定卷名便于备份和恢复;端口左侧限定为 127.0.0.1,避免局域网中的其他设备直接消耗你的 Copilot 配额。
2. 首次启动并授权 GitHub
先以前台方式启动,这样能直接看到设备授权码:
docker compose pull
docker compose up终端会显示类似下面的信息:
GitHub Authentication Required
Please visit: https://github.com/login/device
Enter code: XXXX-XXXX
Waiting for authorization...在浏览器中打开 GitHub Device Activation,登录拥有 Copilot 订阅的账号,输入终端显示的设备码。授权成功后,终端应显示 Authentication successful,随后服务监听容器内的 0.0.0.0:7777。
按 Ctrl+C 停止前台实例,再切换为后台运行:
docker compose up -d
docker compose ps
docker compose logs --tail=100 copilot2apiOAuth 凭据保存在命名卷中,重建容器后仍会保留。不要把该卷的备份发给其他人。
验证部署结果
容器和模型目录
docker compose ps
curl -fsS http://127.0.0.1:7777/v1/models
curl -fsS http://127.0.0.1:7777/usage/v1/models 应返回包含 data 数组的模型列表;/usage 用于查看 Copilot 用量。模型列表由账号、订阅类型及 GitHub 当前目录决定,不要假设所有示例模型都一定可用。
发起一次 OpenAI Chat Completions 请求
下面使用项目 README 中出现的 gpt-5.3-codex。如果返回模型不存在,先从 /v1/models 复制一个实际的 id 再替换。
curl -fsS http://127.0.0.1:7777/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "gpt-5.3-codex",
"messages": [{"role": "user", "content": "只回复 OK"}],
"stream": false
}'成功时响应包含 choices;401/403 通常指向 GitHub/Copilot 授权问题,404 或模型错误则先重新查看 /v1/models。
验证凭据持久化
docker compose restart copilot2api
docker compose logs --tail=50 copilot2api
curl -fsS http://127.0.0.1:7777/v1/models重启后不应再次要求 Device Flow 授权,并且模型列表仍能返回。
接入常用客户端
Claude Code
在目标项目的 .claude/settings.json 中写入:
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:7777",
"ANTHROPIC_API_KEY": "dummy",
"ANTHROPIC_MODEL": "claude-opus-4.6",
"ANTHROPIC_SMALL_FAST_MODEL": "claude-haiku-4.5",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
},
"permissions": {
"deny": ["WebSearch"]
}
}dummy 只是满足客户端字段要求,copilot2api 本身不会校验它。启动 Claude Code 前确认两个模型 ID 都存在于 /v1/models;不存在时使用账号实际返回的 Claude 模型替换。
Codex
在 ~/.codex/config.toml 中加入:
model = "gpt-5.3-codex"
model_provider = "copilot2api"
model_reasoning_effort = "high"
web_search = "disabled"
[model_providers.copilot2api]
name = "copilot2api"
base_url = "http://127.0.0.1:7777/v1"
wire_api = "responses"
api_key = "dummy"项目内置了 codex-auto-review 到 gpt-5.6-luna 的兼容路由。如果 Copilot 模型目录没有 gpt-5.3-codex,把顶层 model 改为 /v1/models 返回的可用 GPT/Codex 模型。
Gemini CLI
在 ~/.gemini/.env 中写入:
GOOGLE_GEMINI_BASE_URL=http://127.0.0.1:7777
GEMINI_API_KEY=dummy
GEMINI_MODEL=claude-opus-4.6-1m同样需要先确认示例模型存在。代理提供 /v1beta/models、generateContent、streamGenerateContent 和 countTokens 兼容路由。
OpenAI SDK
Python 客户端可以直接把 base_url 指向本地代理:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:7777/v1", api_key="dummy")
model = client.models.list().data[0].id
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "只回复 OK"}],
)
print(response.choices[0].message.content)不使用 Docker:安装预编译二进制
预编译文件来自 v0.6.1 Release。二进制默认监听 127.0.0.1:7777,凭据写入 ~/.config/copilot2api/credentials.json。
macOS Apple Silicon
mkdir -p "$HOME/.local/bin"
curl -fL https://github.com/whtsky/copilot2api/releases/download/v0.6.1/copilot2api-darwin-arm64 \
-o "$HOME/.local/bin/copilot2api"
printf '%s %s\n' \
'5450253ca53150a5441cabd52949cb17c4f40806351a4f7f816e39b0d6bbfbc9' \
"$HOME/.local/bin/copilot2api" | shasum -a 256 -c -
chmod 755 "$HOME/.local/bin/copilot2api"
"$HOME/.local/bin/copilot2api"Linux x86-64
mkdir -p "$HOME/.local/bin"
curl -fL https://github.com/whtsky/copilot2api/releases/download/v0.6.1/copilot2api-linux-amd64 \
-o "$HOME/.local/bin/copilot2api"
printf '%s %s\n' \
'282795e112d4fe392564de6b2c3535e1999760c542fc063c5dda147a2f08bf62' \
"$HOME/.local/bin/copilot2api" | sha256sum -c -
chmod 755 "$HOME/.local/bin/copilot2api"
"$HOME/.local/bin/copilot2api"Windows、Intel Mac 和 Linux ARM64 的文件名及 SHA-256 可在 v0.6.1 Release 的 Assets 中核对。首次运行同样会显示 GitHub Device Flow 地址和设备码。
常用参数:
-host string 监听地址,默认 127.0.0.1
-port int 监听端口,默认 7777
-token-dir string 凭据目录,默认 ~/.config/copilot2api
-model-routes string JSON 格式的精确模型路由
-debug 输出调试日志
-version 显示版本日常运维
cd "$HOME/apps/copilot2api"
docker compose ps
docker compose logs --tail=200 copilot2api
docker compose restart copilot2api
docker compose stop
docker compose start需要临时增加日志时,可在 Compose 的服务下加入:
environment:
COPILOT2API_DEBUG: "true"然后执行 docker compose up -d 使配置生效。问题定位完成后删除该设置,避免长期记录过多请求上下文。
备份与恢复
凭据和本地状态都在 copilot2api-data 卷中。备份前停止服务,避免复制过程中继续写入:
cd "$HOME/apps/copilot2api"
docker compose stop copilot2api
BACKUP_DIR="copilot2api-data-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
docker cp copilot2api:/root/.config/copilot2api/. "$BACKUP_DIR"/
tar czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
docker compose start copilot2api恢复时先把归档写入一个新卷,不覆盖现有数据。下面的 docker rm 只删除临时辅助容器,不删除原容器、原卷或备份:
cd "$HOME/apps/copilot2api"
BACKUP_FILE="$(ls -1t copilot2api-data-*.tar.gz | head -1)"
tar tzf "$BACKUP_FILE" | head
RESTORE_DIR="$(mktemp -d)"
tar xzf "$BACKUP_FILE" -C "$RESTORE_DIR"
docker volume create copilot2api-data-restore
docker create \
--name copilot2api-restore-helper \
-v copilot2api-data-restore:/data \
alpine:3.22
docker cp "$RESTORE_DIR"/. copilot2api-restore-helper:/data/
docker rm copilot2api-restore-helper把 compose.yaml 最后一行的 name 临时改为 copilot2api-data-restore,执行 docker compose up -d 并重新检查 /v1/models。验证完成前保留原卷,以便快速回切。
升级和回滚
- 打开 Releases,阅读目标版本说明,确认是否有凭据格式或配置变化。
- 按上一节完成备份。
- 把
compose.yaml的镜像标签从0.6.1改为明确的目标版本;不要改成长期漂移的latest。 - 执行
docker compose pull && docker compose up -d。 - 检查日志、
/v1/models、/usage和一次实际对话请求。
如果新版本启动失败且发布说明没有不可逆数据迁移,把镜像标签改回 0.6.1 并再次执行 docker compose up -d。若发布说明声明了不可逆迁移,应使用备份恢复到新卷,不要让旧版本直接读取已经迁移的数据。
常见问题
每次启动都要求重新授权
检查卷是否挂载,以及容器内是否存在凭据文件:
docker inspect copilot2api --format '{{json .Mounts}}'
CHECK_DIR="$(mktemp -d)"
docker cp copilot2api:/root/.config/copilot2api/. "$CHECK_DIR"/
ls -la "$CHECK_DIR"缺少卷挂载时,容器删除后凭据会一同消失。修正 Compose 后重新完成一次 Device Flow。
本机无法连接 7777
docker compose ps
docker compose logs --tail=100 copilot2api
lsof -nP -iTCP:7777 -sTCP:LISTEN授权尚未完成时服务可能仍在等待 Device Flow;端口被其他进程占用时,修改主机侧端口,例如 127.0.0.1:17777:7777,客户端地址同步改为 http://127.0.0.1:17777。
客户端报告模型不存在
curl -fsS http://127.0.0.1:7777/v1/models以接口实际返回的 ID 为准。Copilot 模型目录会随账号类型、区域和 GitHub 调整而变化。
局域网或远程设备需要访问
不要把端口映射改成 7777:7777 后直接开放。项目没有 API Key 校验,这会形成任何人都能调用的代理。确有跨设备需求时,应在前面增加带认证和 TLS 的反向代理,并通过防火墙限制来源;这已经超出本地部署的安全范围。
部署完成后
- 保留版本固定的
compose.yaml和最近一次可验证备份。 - 定期检查
/usage,避免自动化客户端在后台消耗大量 Copilot 配额。 - GitHub Token、Copilot Token 和数据卷备份都按密钥处理,不上传仓库或发送给他人。
总结
本文使用 ghcr.io/whtsky/copilot2api:0.6.1 和 Docker Compose 部署了一个仅本机可访问的 GitHub Copilot 兼容代理,并覆盖首次 OAuth、模型查询、实际请求、客户端接入、备份及升级流程。最重要的限制是服务不校验 API Key,因此安全边界必须由 127.0.0.1 监听和主机访问控制保证。
参考资料
- 项目 README - 核对版本、端口、凭据目录、客户端配置和安全限制;核对日期:2026-08-26
- v0.6.1 Release - 核对版本、二进制文件与 SHA-256;发布于 2026-08-21
- GHCR 镜像 0.6.1 - 核对镜像标签、摘要及支持架构;核对日期:2026-08-26
- v0.6.1 Dockerfile.ci - 核对容器监听地址、端口和入口命令
- GitHub Copilot 产品条款 - 使用账号和订阅前应核对的官方条款