dsh-plugin-container
Docker 容器沙箱部署级插件(与 dsh-plugin-vm-sandbox 全能力对齐,无需 OrbStack):39 个 docker_* 模型工具、快照/回滚、文件传输、端口转发、后台任务、审计、共享/配额/回收、网络策略与华丽原生 UI。
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 15, 2026
- Updated
- Aug 17, 2026
Introduction
dsh-plugin-container
DeepSeek Harness(DSH)的 Docker 容器沙箱 部署级插件。
在会话视图环中新增「容器」页签,提供 仅观察 / 干预 双模式原生 UI、39 个docker_*模型工具、15 个/dock-api/*HTTP 路由,并完整对齐官方dsh-plugin-vm-sandboxv0.1.0 的全部能力:快照/回滚、文件传输、端口转发、后台任务、审计、共享协作、配额与回收、网络策略、自定义资源、初始化脚本、多容器并行执行、增强状态查询。
为什么需要这个插件?
官方 dsh-plugin-vm-sandbox 依赖 OrbStack(macOS 专属)。Linux 用户与 Windows 用户没有 OrbStack,就无法获得会话级沙箱能力。
本插件以 本地 Docker Engine 作为底层,把 VM 沙箱的能力一一映射到 Docker:
| 能力 | dsh-plugin-vm-sandbox | dsh-plugin-container v1.0.0 |
|---|---|---|
| 清单 / 创建 / 删除 | vm_list / vm_create / vm_delete | docker_ps / docker_create / docker_run / docker_rm |
| 生命周期 | vm_start / vm_stop / vm_restart | docker_start / docker_stop / docker_restart |
| 增强状态 | vm_status | docker_status |
| 快照 / 回滚 | vm_snapshot / vm_snapshot_list / vm_restore / vm_snapshot_delete | docker_snapshot / docker_snapshot_list / docker_restore / docker_snapshot_delete |
| 文件传输 | vm_upload / vm_download | docker_upload / docker_download |
| 端口转发 | vm_port_forward / vm_port_forward_list / vm_port_forward_stop | docker_port_forward / docker_port_forward_list / docker_port_forward_stop |
| 后台任务 | vm_job_submit / vm_job_list / vm_job_status / vm_job_stop / vm_job_output | docker_job_submit / docker_job_list / docker_job_status / docker_job_stop / docker_job_output |
| 操作审计 | vm_audit | docker_audit |
| 共享协作 | vm_share / vm_unshare / vm_policy | docker_share / docker_unshare / docker_policy |
| 网络策略 | vm_network | docker_network_policy |
| 命令执行 | vm_exec(支持 machines 并行) | docker_exec(支持 containers 并行) |
| 自定义资源 | cpus / memory / disk | cpus / memory / memory_swap / shm_size / pids_limit / disk_quota |
| 初始化脚本 | init_script / cloud_init | init_script / command |
Docker 与 OrbStack 是两种不同抽象:OrbStack 的
orb clone按需复制磁盘、orb push/pull直接进入 VM;Docker 版本使用docker commit镜像快照与docker cp文件传输,语义等价、实现完全 Docker-native。网络策略则通过dsh-sandbox公网 bridge 与dsh-sandbox-internal内部网络(docker network create --internal)实现。
项目定位
- 部署级插件:与官方 VM 沙箱一致,不依赖私有 RPC。面板数据全部通过宿主
webServer暴露的/dock-api/*标准 HTTP 路由获取。 - 官方目录结构:严格参照
dsh-plugin-vm-sandbox仓库布局(根包prepare→dsh-plugin-container/lib发布入口;内层dsh-plugin-container/为 npm 发布包;cordis.patch.yml自动插入ui-container)。 - 零运行时依赖:Host 半区只使用 Node 内置模块与官方
dockerCLI;Client 半区仅依赖react浏览器模块。 - 跨平台:只要 Docker CLI 能连上 Docker Engine 即可使用 —— Linux、Windows(Docker Desktop)、macOS(Docker Desktop / OrbStack Docker context)全部支持。
功能特性
原生级 UI(会话视图环「容器」页签)
- 毛玻璃渐变背景、状态呼吸灯、玻璃拟态统计卡、丝滑展开/切换动画。
- 顶部模式切换:仅观察(默认,隐藏全部写操作)/ 干预(显示创建、启动、停止、重启、快照、删除)。
- 容器 / 快照两个视图;容器支持搜索与「全部 / 本会话 / 运行中」过滤。
- 每个容器行内展示状态、镜像、CPU / 内存占用;展开后提供 概览 / 日志 / Shell / 任务 / 端口 五个页签。
- 概览:完整 inspect 配置、挂载、实时 CPU/内存/根分区、uptime、资源限额。
- 日志:
docker logs最近 500 行,支持跟随刷新。 - Shell:
docker_exec执行记录(命令 / 耗时 / 退出码 / stdout+stderr)与 只读实时 stdout/stderr 观察流(暂停 / 清空 / 重连,90 秒无读取自动回收)。 - 任务:该容器的后台任务列表;端口:该容器的端口转发隧道列表。
- 创建弹窗:镜像、名称、CPU / 内存 / shm / 磁盘配额、启动命令或初始化脚本、端口 / 环境变量 / 卷、网络、重启策略、内部网络 / 完全无网络 / TTY。
- 快照弹窗:备注说明后一键
docker commit快照;快照列表支持一键恢复 / 删除。 - 全部使用 DSH 官方
--dsw-alias-*设计令牌,自动适配浅色 / 深色主题与品牌变量。 - 静态设计稿:见仓库
docs/ui-preview.html。
快照与回滚
docker_snapshot:基于官方docker commit --change LABEL ...生成带dsh.snapshot=1标签的快照镜像,自动保存来源容器的 run spec(端口 / 卷 / 环境 / 网络 / 资源限额 / 命令)。docker_snapshot_list:列出全部快照及本会话快照。docker_restore:删除当前容器 → 用快照镜像 + 原 run spec 重建 → 按原状态启动 / 保持创建态;快照记录保留,可重复回滚。docker_snapshot_delete:docker rmi -f永久删除快照镜像。- 限额:全局 64 个、每会话 16 个。
文件传输
docker_upload/docker_download:基于官方docker cp,支持文件与目录递归。local_path强制约束在 DSH 工作区内(sandboxPolicy.workspaceRoot),防止任意宿主机路径读取。
端口转发
docker_port_forward:在容器所在 bridge 网络上启动alpine/socat代理容器,-p 127.0.0.1:host_port:proxy_port映射到本地回环;无需修改原容器、无需重建。- 自动分配空闲本地端口或指定
host_port;bind_host仅允许localhost/127.0.0.1/::1。 docker_port_forward_list/docker_port_forward_stop(按tunnel_id或host_port停止)。- 隧道状态持久化,容器删除 / 恢复 / 插件对账时自动回收代理容器。
后台任务
docker_job_submit:命令经 base64 写入容器/tmp/.dsh-jobs/<job-id>/,以nohup sh run.sh &在容器内后台执行,不受单次docker_exec超时限制。docker_job_list/docker_job_status/docker_job_stop/docker_job_output。- 每会话最多 32 个运行中任务;容器删除 / 恢复时自动终止并标记错误。
审计
- 所有 39 个工具调用(含
docker_cli直通)统一经过审计包装器:记录 sessionId、容器、操作名、参数摘要、耗时、成功 / 失败与错误。 - 面板操作(创建 / 启停 / 删除 / 快照 / 恢复)同样写入审计。
docker_audit支持按 session / container / operation 过滤。
共享协作与资源治理
docker_share/docker_unshare:把当前会话容器共享给其他会话;mode=exec(执行 / 传输 / 任务 / 端口转发)或mode=manage(额外允许生命周期 / 网络 / 快照)。docker_policy:每会话最大容器数(1–8,默认 8)、闲置自动停止分钟数(默认 30)、闲置自动删除天数(默认 0 关闭)。- 全局运行上限 64,超过后仅自动停止本插件创建的、超过 15 分钟未使用的旧容器,绝不干扰用户手工容器。
- 归档 / 删除会话自动清理其容器;
domain/changed、session/disposed事件驱动 + 每 5 分钟对账。
网络策略
docker_network_policy:public_access/internal_access/isolated/isolate_network。public_access=false:保存当前网络,断开除dsh-sandbox-internal外的网络,接入--internal内部网络(无法访问公网)。internal_access=false:断开沙箱内部网络。isolated=true:断开全部网络,等价--network none。isolate_network=true:仅保留内部网络并强制public_access=false。
- 策略持久化,容器每次启动时自动重新应用。
基础 Docker 能力(保留并增强)
原有 18 个工具全部保留:docker_info、docker_ps、docker_images、docker_pull、docker_run、docker_start、docker_stop、docker_restart、docker_rm、docker_rmi、docker_logs、docker_exec、docker_inspect、docker_stats、docker_network、docker_volume、docker_build、docker_cli。
架构
浏览器 (client, lib/client.js) Node (host, lib/index.js)
┌────────────────────────────────────────┐ fetch ┌───────────────────────────────────────────┐
│ window.__ModuleLoader__.load({...}) │ ───────▶ │ webServer.register({kind:'exact',...}) │
│ slots.inject('conversation.view') │ │ /dock-api/status|inspect|logs|top|op| │
│ 原生 UI: 模式/统计/创建/详情/日志/Shell │ ◀─────── │ create|shell|snapshot|restore|... │
│ 快照/任务/端口视图 │ JSON ├───────────────────────────────────────────┤
└────────────────────────────────────────┘ │ tools.register × 39 (docker_*) │
│ execFile/spawn('docker', ...) │
│ 状态 ~/.dsh/container-sandbox/state.json │
└───────────────────────────────────────────┘
- Host 侧:零外部运行时依赖;负责执行 Docker CLI、维护日志观察 / socat 代理子进程、注册 HTTP 路由与模型工具、治理配额 / 闲置回收 / 归档清理。
- Client 侧:CJS closure-factory bundle,仅依赖
react;注入conversation.view(iddocker,order10.5,label「容器」)。 - 可卸载性:路由 disposer、工具注册、watcher 进程、socat 代理、定时器与样式均通过
ctx.effect管理,插件卸载时自动清理。
安全模型
- 默认只读 UI:未切换到「干预」模式前不显示任何写操作入口。
- 删除二次确认:容器删除需二次点击确认;快照删除使用原生
confirm二次确认。 - Shell 观察无交互通道:只读
docker logs -f流,不带 stdin,模型无法通过该面板注入命令。 - 工作区路径约束:
docker_upload/docker_download/docker_build的宿主机路径必须位于工作区内。 - 共享权限边界:插件登记的容器按 owner / exec / manage 三级校验;跨会话未共享的操作会被拒绝。
- 不引入私有 RPC:面板全部走标准 HTTP 路由,权限边界与 DSH 部署插件保持一致。
- 输出截断与超时保护:长输出截断、Docker 调用默认 120 秒超时(pull/build 等长任务 10–15 分钟上限)。
安装
方式 A:dsh CLI 从 GitHub 安装(推荐)
需要已安装 pnpm 与 dsh CLI:
npx -p @deepseek-ai/dsh dsh plugin --profile web add https://github.com/GHJIVHIDD/dsh-plugin-container
# 或 git 简写
npx -p @deepseek-ai/dsh dsh plugin --profile web add GHJIVHIDD/dsh-plugin-container
安装过程由官方机制自动完成:
- pnpm 从仓库安装包并写入 profile 的
dependencies。 - 根据
dsh.bundle声明自动 reconcile 进dsh.profile.bundles层。 - 应用
cordis.patch.yml,自动插入ui-container行,无需手工编辑配置。
重启 dsh(web 或 headless)后刷新浏览器即可看到「容器」页签。
方式 B:Releases tgz 安装
从 Releases 下载 dsh-plugin-container-1.0.3.tgz,在包所在目录执行:
dsh plugin --profile web add ./dsh-plugin-container-1.0.3.tgz
方式 C:手动安装
# 1. 将包复制到 profile 的插件目录
cp -R dsh-plugin-container ~/.dsh/profiles/web/node_modules/@dsh-community/
# 2. 在用户补丁层注册插件行
cat >> ~/.dsh/profiles/web/cordis.patch.yml << 'EOF'
- insert:
- id: ui-container
name: '@dsh-community/dsh-plugin-container'
EOF
# 3. 重启 profile
卸载
dsh plugin --profile web remove @dsh-community/dsh-plugin-container
# 手动安装的:移除补丁中的 ui-container 行并删除包目录
使用
dsh --profile web
进入任意会话点击「容器」页签;智能体可直接调用 docker_create、docker_exec、docker_snapshot、docker_upload、docker_job_submit、docker_network_policy 等 39 个工具管理 Docker 沙箱。
兼容性
- 面向 DeepSeek Harness
webprofile。 - 需要 Web 端启用
@deepseek-ai/dsh-client-runtime与@deepseek-ai/dsh-client-ui-conversation。 - 宿主机需要
dockerCLI 位于PATH且能连接 Docker Engine。- Linux:Docker Engine / rootless Docker / Docker Desktop。
- Windows:Docker Desktop(建议启用 WSL2 backend)。
- macOS:Docker Desktop 或 OrbStack 的 Docker context。
- 端口转发依赖
alpine/socat(官方镜像,首次使用自动 pull)。 - 插件版本:1.0.3。
验证
仓库内置两级测试,必须全部通过:
# 1. 结构 + 语法 + 39 工具/15 路由 + schema + live docker_info + client 沙箱模拟
npm run verify
# 2. 真实 Docker 集成冒烟:创建/并行 exec/生命周期/上传下载/后台任务/
# 端口转发实测回显/快照回滚/共享/策略/网络策略/审计/清理核验
npm run smoke
# 3. 生成 releases 包并校验 tarball 内容
npm run pack
verify 覆盖
- 双半区语法检查。
- Host ESM 导出
apply+inject。 - Mock Cordis 上下文下 39 个工具与 15 个路由注册、effects disposer 清理。
- 与
dsh-plugin-vm-sandbox对应的 19 组工具 schema 参数逐项比对。 - 真实
docker_info调用(Docker daemon 不可用时硬失败)。 - Client bundle 在 Node
vm浏览器沙箱中执行,断言id、apply/inject、slots.inject('conversation.view')与样式挂载/卸载。
smoke 覆盖(真实 Docker)
docker_info实时探测。docker_create带cpus/memory/shm_size创建容器,docker_status校验 owner / running / runtime。docker_exec双容器并行执行。docker_stop/docker_start/docker_restart。docker_upload/docker_download内容一致性。- 后台任务提交、轮询完成、列表、完整日志。
alpine/socatecho 容器 +docker_port_forward,宿主机nc实测回显,转发停止。docker_snapshot→ 修改容器 →docker_restore→ 校验快照标记恢复 →docker_snapshot_delete。docker_share后跨会话 exec、docker_unshare。docker_policy设置。docker_network_policy公网关闭 / 内部网络应用 / 恢复。docker_audit过滤校验。- finally 中自动清理全部
dsh-smoke-*容器、dsh-pf-*代理、dsh-snap-*快照镜像,并验证无残留。
目录结构
dsh-plugin-container/
├── package.json # 仓库根即插件源包(含 dsh.bundle / dsh.client)
├── scripts/
│ ├── prepare.mjs # 根包 prepare:构建 dsh-plugin-container/lib
│ ├── verify.mjs # 严格静态/结构/live 验证
│ ├── smoke.mjs # 真实 Docker 集成冒烟
│ └── package.mjs # 生成并校验 releases tgz
├── dsh-plugin-container/
│ ├── package.json # 内层发布包
│ ├── cordis.patch.yml # 自动插入「容器」页签的 patch 层
│ ├── src/
│ │ ├── index.js # Host 侧实现(39 工具 + 15 路由)
│ │ ├── client.js # 浏览器端原生 UI
│ │ └── types/index.d.ts # Host 类型声明
│ ├── lib/ # prepare 生成的发布入口(已提交)
│ └── scripts/prepare.mjs
├── docs/
│ └── ui-preview.html # UI 静态设计稿(可独立浏览器打开预览)
├── LICENSE
└── README.md
v1.0.0 更新内容(详细)
新增能力(对齐 dsh-plugin-vm-sandbox)
docker_snapshot/docker_snapshot_list/docker_restore/docker_snapshot_deletedocker commit --change LABEL带标签快照镜像;自动保存/恢复 run spec;限额治理。
docker_upload/docker_downloaddocker cp双向文件传输,工作区路径约束。
docker_port_forward/docker_port_forward_list/docker_port_forward_stopalpine/socat代理容器端口转发,支持本地端口自动分配与回收。
docker_job_submit/docker_job_list/docker_job_status/docker_job_stop/docker_job_output- 容器内
/tmp/.dsh-jobs后台任务执行器,含状态探测与日志输出。
- 容器内
docker_audit- 39 个工具 + 面板操作统一审计包装器,支持过滤查询。
docker_share/docker_unshare/docker_policy- 会话间 exec/manage 共享、每会话配额、闲置停止/删除回收。
docker_network_policy- 公网 / 内部网络 / 完全隔离 / 仅内部网络四类策略,持久化重放。
docker_status- 增强状态:IP、网络、挂载、资源限额与实时用量、uptime、最近 Shell、任务、隧道。
docker_create- VM 风格创建工具:自动命名、资源规格、初始化脚本、隔离网络。
docker_exec增强containers数组并行执行、timeout_ms、Shell 执行记录。
docker_run增强cpus/memory/memory_swap/shm_size/pids_limit/disk_quota、isolated/isolate_network、会话归属登记。
UI 重构
- 从旧版简单列表升级为原生级完整控制台:
- 渐变光晕背景 + 玻璃拟态统计卡 + 状态呼吸灯。
- 仅观察 / 干预双模式分段控件。
- 容器 / 快照双视图、搜索、过滤。
- 五页签详情(概览 / 日志 / Shell / 任务 / 端口)。
- 创建容器弹窗、快照备注弹窗、操作 toast、确认式删除。
- 使用 DSH 官方设计令牌,自动主题适配。
工程化重构
- 仓库布局严格对齐官方
dsh-plugin-vm-sandbox(根包 + 内层发布包 + prepare)。 scripts/verify.mjs全面重写:39 工具 / 15 路由 / 19 组 schema 比对 / live daemon 探测 / 浏览器沙箱执行。- 新增
scripts/smoke.mjs:真实 Docker 18 项集成冒烟与清理核验。 - 新增
scripts/package.mjs:npm pack 生成 releases tgz 并校验 tarball 内容。 - 状态持久化升级至
~/.dsh/container-sandbox/state.json(containers / snapshots / shares / policies / network / jobs / tunnels / audit)。
兼容性与破坏性变更
- 旧的 7 个
/dock-api/*路由与 18 个docker_*工具全部保留,现有用法不受影响。 - 插件登记容器新增 owner / share 权限校验;跨会话未共享时,原可操作行为会被拒绝(更安全,与 VM 沙箱一致)。
docker_run/docker_create默认网络由bridge改为dsh-sandbox(自动创建),便于统一网络策略治理;可通过network参数覆盖。
v1.0.3 修复内容(详细)
- 修复面板创建容器时
pids_limit留空被透传为--pids-limit ""导致 Docker 报invalid argument ""的问题;空值现在与未传值一致,不再生成参数。 scripts/verify.mjs新增静态回归断言:buildRunArgs的 pids-limit 分支必须带非空字符串保护。- 修复后
/dock-api/create全参数路径实测通过。
v1.0.2 修复内容(详细)
- 修复
/dock-api/create路由错误分支的sessionId作用域错误:缺少session或创建失败时,catch 分支原先会因未定义变量再次抛错,导致webServer返回 400 空响应而不是 JSON 500。 scripts/verify.mjs新增路由错误路径回归:直接调用/dock-api/create缺失 session 的 handler,断言返回 JSON 500 且 handler 不 reject。- 完整 HTTP 路由实测(15/15)在 v1.0.2 通过。
v1.0.1 修复内容(详细)
- 修复
docker_job_stop主动停止的后台任务,在随后docker_job_list/docker_job_status探针中被错误覆盖为running的终态污染问题。 readJobStatus现在对done/error/stopped三种终态严格保护:终态不会被docker exec探针的running/dead覆盖,endTime与退出码同样保持稳定。scripts/smoke.mjs新增回归断言:提交长任务 →docker_job_stop→docker_job_list必须保持stopped且endTime非空。