mhommen/OpenCode-Docker-Sandbox
GitHub: mhommen/OpenCode-Docker-Sandbox
一个经过强化的 Docker 沙盒环境,用于在隔离的容器中安全地运行 OpenCode AI 编程 CLI 并连接本地或远程 Ollama 服务。
Stars: 1 | Forks: 0
# OpenCode Docker 沙盒
在使用本地或远程 Ollama 服务器的同时,在经过强化的 Docker 容器内运行 OpenCode AI 编程 CLI。
本项目专为那些希望在本地试验编程 AI Agent,同时又不想让它们直接访问宿主机的开发者而设计。
## 为什么会有这个项目
AI 编程 Agent 非常实用,但它们也能执行命令、编辑文件、安装工具,并且极快地犯错。
直接在宿主机上运行 Agent 可能会让人感到不安,尤其是在测试新模型、工具或工作流时。
这个沙盒提供了一个实用的折中方案:
* OpenCode 运行在 Docker 容器内
* 仅挂载选定的项目目录
* 使用宿主机的 UID/GID 写入文件
* Ollama 仍然运行在宿主机或其他可访问的机器上
* 容器以非 root 用户身份运行
* 移除了 `sudo`、`su` 和 `pkexec` 等权限提升工具
* 启动器会丢弃 Linux capabilities
它并非完美的安全边界,但能有效降低本地 Agent 试验的爆炸半径。
## 包含的内容
该镜像目前包含:
* Ubuntu 26.04 基础镜像
* Node.js 22
* .NET 9 SDK 和运行时
* Python 3
* 常用的构建工具
* 默认编辑器 Neovim
* 通过 `opencode-ai` npm 包提供的 OpenCode CLI
* 支持 Ollama CLI
容器内不会启动 Ollama 服务器。容器将连接到运行在宿主机或其他可访问机器上的 Ollama 服务器。
## 前置要求
你需要:
* Docker
* 容器可访问的 Ollama 服务器
* 在 Ollama 中至少拉取一个模型
* 一个你想要处理的项目目录
示例:
```
ollama pull
```
## 快速开始
克隆仓库:
```
git clone https://github.com/mhommen/OpenCode-Docker-Sandbox.git
cd OpenCode-Docker-Sandbox
```
构建镜像:
```
./build-image.sh
```
在项目目录中启动 OpenCode:
```
./ocsb.sh ~/projects/my-app
```
项目目录将被挂载到容器内的:
```
/source
```
OpenCode 将在该目录中启动。
## 使用远程 Ollama 服务器
默认情况下,启动器使用:
```
http://host.docker.internal:11434
```
你可以使用 `-o` 或 `--ollama` 覆盖它:
```
./ocsb.sh -o http://192.168.1.10:11434 ~/projects/my-app
```
当 Ollama 运行在本地网络中的另一台机器上时,这非常有用。
## 工作原理
启动脚本会:
1. 检查项目目录
2. 将其作为 `/source` 挂载到容器中
3. 创建临时的 OpenCode 配置
4. 将 OpenCode 指向兼容 OpenAI API 的 Ollama 接口
5. 以非 root 用户身份启动容器
6. 丢弃容器的 capabilities
7. 在挂载的项目中启动 OpenCode
随后,entrypoint 会向 Ollama 查询可用模型,并将检测到的第一个模型作为默认的 OpenCode 模型。
## 安全模型
此沙盒旨在降低试验本地 AI 编程 Agent 时的风险。
它通过以下方式实现:
* 以非 root 用户 `developer` 身份运行
* 匹配宿主机的 UID/GID,避免在宿主机上产生 root 所属的文件
* 仅挂载选定的项目目录
* 移除 `sudo`、`su`、`sudoedit`、`sudoreplay` 和 `pkexec`
* 通过启动器丢弃 Linux capabilities
* 将 Ollama 服务器保留在容器外部
* 避免直接访问你的整个主目录
## 重要限制
这并不是一个针对恶意代码的强隔离边界。
Docker 容器是有用的隔离层,但它们并不是虚拟机。坚定的攻击者、恶意的依赖项或容器逃逸漏洞仍然可能带来危险。
请将此项目作为本地试验的实用安全层,而不是将其视为不受信任代码无害的绝对保证。
特别是:
* 挂载的项目目录可能会被 Agent 修改
* 容器内仍然可以使用网络访问
* 命令仍然可以在容器内运行
* 挂载项目中的密钥可能会对 Agent 可见
* 必须信任 Docker 本身
如需更强的隔离,请考虑使用虚拟机(VM)、微型虚拟机(microVM)、一次性开发环境或专用机器。
## 仓库布局
| 路径 | 用途 |
| -------------------------- | ----------------------------------------------------- |
| `Dockerfile` | 定义沙盒镜像 |
| `build-image.sh` | 使用你宿主机的 UID/GID 构建镜像 |
| `ocsb.sh` | 为选定的项目目录启动容器 |
| `scripts/oc-entrypoint.sh` | 发现 Ollama 模型并启动 OpenCode |
## 自定义镜像名称或标签
辅助脚本通过环境变量支持自定义镜像名称和标签。
示例:
```
IMAGE_NAME=opencode-sandbox IMAGE_TAG=test ./build-image.sh
```
使用相同的值运行它:
```
IMAGE_NAME=opencode-sandbox IMAGE_TAG=test ./ocsb.sh ~/projects/my-app
```
## 故障排除
### OpenCode 启动了,但未找到 Ollama 模型
确保 Ollama 正在运行:
```
ollama list
```
检查 Ollama API 是否可访问:
```
curl http://localhost:11434/api/tags
```
使用远程 Ollama 服务器时,请显式传入 URL:
```
./ocsb.sh -o http://192.168.1.10:11434 ~/projects/my-app
```
### 文件归属于错误的用户
在你要使用它的机器和用户账户上重新构建镜像:
```
./build-image.sh
```
镜像在构建过程中会固化你当前的 UID/GID。
### Agent 无法访问项目外部的文件
这是有意为之的。
只有选定的项目目录会被挂载到 `/source`。如果你想公开不同的项目,请使用不同的目录启动沙盒。
## 建议的用例
本项目适用于:
* 尝试将 OpenCode 与本地 Ollama 模型结合使用
* 比较本地编程模型
* 让 Agent 在临时分支上工作
* 在受限环境中试验生成的代码
* 避免 Agent 直接访问你的宿主系统
## 不推荐用于
本项目不适用于:
* 安全地运行恶意代码
* 处理高度敏感的密钥
* 隔离生产环境的凭据
* 替代正式的虚拟机或经过强化的沙盒
* 给予不受信任的 Agent 不受限的互联网访问权限
## 许可证
MIT
标签:AI编程助手, AI风险缓解, Cutter, Docker沙箱, MITM代理, NIDS, 多人体追踪, 安全隔离, 容器化, 开发环境, 请求拦截, 逆向工具