OpenCode Sandbox Docker 部署指南
概述
在独立 Docker 容器中运行 OpenCode,提供隔离环境供 Hermes SSH 调用。
Hermes (VPS A) --SSH--> OpenCode 容器 (VPS B)
└── 只允许运行 opencode 命令
架构
| 组件 | 说明 |
|---|---|
| 镜像 | Debian Bookworm Slim + OpenCode CLI |
| SSH 端口 | 2222 (宿主机) |
| 用户 | opencode |
| 资源占用 | ~200MB 内存 |
文件结构
/opt/opencode/
├── docker-compose.yml # 容器编排
└── opencode-sandbox/
└── Dockerfile # 镜像构建
快速部署
1. 创建目录和文件
mkdir -p /opt/opencode
cd /opt/opencode
2. Dockerfile
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y \
openssh-server \
curl \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /run/sshd
# 创建 .ssh 目录
RUN mkdir -p /home/opencode/.ssh && chmod 700 /home/opencode/.ssh
# 安装 opencode
RUN curl -sL "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-linux-x64.tar.gz" | \
tar -xzf - -C /usr/local/bin && chmod 755 /usr/local/bin/opencode
# 创建用户并修复权限
RUN useradd -m -s /bin/bash opencode && \
echo "opencode:password" | chpasswd && \
chown -R opencode:opencode /home/opencode
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
3. docker-compose.yml
services:
opencode-sandbox:
build: ./opencode-sandbox
container_name: opencode-sandbox
ports:
- "2222:22"
restart: unless-stopped
# 注意:不要在这里挂载 authorized_keys,会被当成目录创建!
4. 构建和启动
cd /opt/opencode
docker compose up -d --build
5. 修复权限问题(如果需要)
如果 Dockerfile 中已添加 chown -R opencode:opencode /home/opencode,这步可以跳过。
否则手动修复:
docker exec -it opencode-sandbox bash -c "chown -R opencode:opencode /home/opencode"
6. 启用 SSH 公钥登录(可选)
# 启用 PubkeyAuthentication
docker exec -it opencode-sandbox bash -c "echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config"
# 重启
docker restart opencode-sandbox
7. 设置用户密码
docker exec -it opencode-sandbox bash -c "echo 'opencode:你的密码' | chpasswd"
8. 测试连接
ssh -p 2222 opencode@localhost
配置 SSH 密钥登录(可选)
1. 生成密钥对
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_opencode -N "" -C "opencode-sandbox"
2. 添加公钥到容器
# 查看公钥
cat ~/.ssh/id_ed25519_opencode.pub
# 在容器内创建 authorized_keys
docker exec -it opencode-sandbox bash -c "echo 'ssh-ed25519 AAAAC3... opencode-sandbox' >> /home/opencode/.ssh/authorized_keys"
docker exec -it opencode-sandbox bash -c "chmod 600 /home/opencode/.ssh/authorized_keys"
docker exec -it opencode-sandbox bash -c "chown opencode:opencode /home/opencode/.ssh/authorized_keys"
3. 测试密钥登录
ssh -i ~/.ssh/id_ed25519_opencode -p 2222 opencode@localhost
使用方法
从 Hermes SSH 调用
ssh -p 2222 opencode@VPS_IP "opencode run '你的任务' --model opencode/deepseek-v4-flash-free"
常用命令
# 查看容器状态
docker ps
# 查看日志
docker logs -f opencode-sandbox
# 进入容器
docker exec -it opencode-sandbox bash
# 停止/启动
docker stop opencode-sandbox
docker start opencode-sandbox
限制用户只能运行 opencode(进阶)
在 authorized_keys 中添加限制:
command="/usr/local/bin/opencode run $SSH_ORIGINAL_COMMAND" ssh-ed25519 AAAA... user@host
这样用户 SSH 登录后只能执行 opencode 命令,无法执行其他操作。
常见问题
Q: SSH 一直重启?
A: 缺少 /run/sshd 目录,确保 Dockerfile 中有 RUN mkdir -p /run/sshd
Q: 公钥登录失败?
A: 检查 /etc/ssh/sshd_config 中 PubkeyAuthentication yes 已启用
Q: 权限被拒绝(EACCES: permission denied, mkdir ‘/home/opencode/.local’)?
A: /home/opencode 属于 root,从宿主机执行:
docker exec -it opencode-sandbox bash -c "chown -R opencode:opencode /home/opencode"
Q: authorized_keys 文件变成了目录?
A: 不要在 docker-compose.yml 里挂载 authorized_keys,手动在容器内创建:
docker exec -it opencode-sandbox bash -c "mkdir -p /home/opencode/.ssh"
docker exec -it opencode-sandbox bash -c "echo '你的公钥' > /home/opencode/.ssh/authorized_keys"
安全建议
| 建议 | 说明 |
|---|---|
| 使用密钥登录 | 禁用密码登录 |
| 修改默认端口 | 2222 改为你喜欢的端口 |
| 限制命令 | 使用 command= 限制只能跑 opencode |
| 定期更新 | 及时更新 OpenCode 版本 |
更新 OpenCode 版本
cd /opt/opencode
# 修改 Dockerfile 中的版本号
# RUN curl -sL "https://github.com/anomalyco/opencode/releases/download/v1.XX.X/opencode-linux-x64.tar.gz" | \
# 重新构建
docker compose up -d --build
评论区