前言¶
在 DeepSeek Harness(DSH)里和智能体协作时,常见两类瓶颈:本机算力或内存不够(大模型推理、长时间构建、批量任务),以及不敢在本机直接执行不受信任或实验性代码。常见做法是手动 SSH 上去跑命令、自己写 scp/rsync 传文件、另开终端盯日志——步骤分散,Agent 也很难把「登记机器 → 传代码 → 隔离执行 → 跟状态 → 拉回产物」串成稳定流程。
下面介绍社区插件 dsh-task2docker-studio(维护者 CarryChang,GitHub 分类为工作流相关能力)。它在 DSH 侧提供一组工具,把任务下发到你已经能通过 SSH 连上的机器:可选 Docker 容器隔离运行,配合 scp 传文件,并用状态与日志接口跟随任务。设计上厂家中立,不绑定特定云 API;同一套逻辑还以开放 Agent Skills 形式提供,可装进 Claude Code、Cursor、Copilot 等环境,从 shell 驱动。
这是什么¶
dsh-task2docker-studio 是面向 DeepSeek Harness 的「Task-to-Docker studio」插件:主机只做控制器——登记 runner、下发任务、跟随结果;计算发生在你可控的远程机上。
两类典型场景(README 原文表述):
- 主机弱于目标环境:模型放不下、构建太慢、批任务太大时,改在能扛住的 server 上跑。
- 安全执行:不可信或实验代码在远端一次性 Docker 容器里跑(推荐设镜像以隔离),与本机打字环境分离。
指定镜像时任务以 detached 容器运行;否则在 runner 上以后台进程方式执行。插件 MIT 许可;仓库 CarryChang/dsh-task2docker-studio,社区目录页见 SkillHub 条目。DSH 生态强调「一切皆插件」;SkillHub 等为社区目录,与 DeepSeek / 幻方无官方从属关系,下文安装与配置均以仓库 README 为准。
核心功能¶
插件向 Agent 暴露的工具如下(名称与用途来自 README 表格):
| 工具 | 作用 |
|---|---|
t2d_register_runner |
登记 runner:名称、host、port、user、认证(key / sshpass),可选默认镜像 |
t2d_list_runners |
列出已登记 runner(仅凭证指针,不输出密钥) |
t2d_remove_runner |
移除 runner |
t2d_copy_to |
经 scp 将本机文件/目录推到 runner |
t2d_copy_from |
从 runner 拉回产物 |
t2d_run |
向 runner 下发命令 → 生成可跟踪 job(容器或原生);可用 mounts 把 host 路径挂进容器 |
t2d_status |
轮询 job:RUNNING / SUCCEEDED / FAILED / STOPPED 及退出码 |
t2d_logs |
查看或有限时间跟随任务输出 |
t2d_stop |
停止 job |
内置 skill(task2docker-studio)描述推荐闭环:list → register → copy_to → run(含 mounts)→ status → logs → copy_from → stop,并覆盖容器与原生执行、文件传输与密钥处理规则。
后端通过注入的 SshClient 与 runner 通信,无厂商 SDK;skills/dsh-task2docker-studio/ 下另有 stdlib-only 的 scripts/t2d.mjs CLI,与插件共用同一套 dispatch 逻辑。
安装与启用¶
在 DSH 中安装(README 给出的命令,勿自行改写 URL 形式):
dsh plugin --profile web add https://github.com/CarryChang/dsh-task2docker-studio
登记 runner 可在对话中即时完成,例如:
> 我有一台服务器 203.0.113.10,root + 公钥免密,名字叫 gpu-box,帮我登记,之后训练都丢它上面跑
也可在 profile 的 cordis.yml 中预置,启动即就绪:
- id: task2docker
name: dsh-task2docker-studio
config:
stateDir: '' # 默认 ~/.dsh-task2docker(runners.json + jobs.json)
sshTimeoutSec: 60
runners:
- name: gpu-box
host: 203.0.113.10
user: root
auth: key
defaultImage: nvidia/cuda:12.4.1-base-ubuntu22.04
- name: isolated
host: 203.0.113.20
auth: sshpass
passwordEnv: ISOLATED_PW # 或 passwordFile: /run/secrets/isolated_pw
凭证:公钥 / agent 路径不落盘秘密;sshpass 方式仅在配置里保存 passwordEnv 或 passwordFile 指针,调用时读取,不写入账本、不出现在工具输出中。密码认证需本机安装 sshpass,README 建议优先密钥。
安装插件前,应按惯例检查仓库源码与 MIT 许可证;插件在当前 dsh 进程权限下运行,会代表你发起 SSH/scp 并在远端执行命令,只应登记你信任且有权使用的机器。
典型用法¶
README 中的对话示例可直接改写路径与镜像试跑:
> 把 ./train.py 丢到 gpu-box 上用 pytorch:2.4 镜像跑起来,跑完告诉我状态
> 这段不受信任的脚本别在我本机跑,去 isolated 上开个容器执行,只看输出
> run npm ci && npm test on my build server and tail the log
传本地目录、挂载进容器、跟日志、拉回产物的完整表述:
> 把本地 ./src 目录传到 gpu-box 的 /data/src,然后挂载进容器跑 python /data/src/train.py,
> 实时看 60 秒日志,跑完把 /data/out 拉回本地
不依赖 DSH 时,可复制 skills/dsh-task2docker-studio/,用 CLI 走同一流程(README 摘录):
cd skills/dsh-task2docker-studio
node scripts/t2d.mjs register --name gpu-box --host 203.0.113.10 --user root --image pytorch:2.4
node scripts/t2d.mjs run --runner gpu-box --command "python train.py" # detached container
node scripts/t2d.mjs status --job <id>
node scripts/t2d.mjs logs --job <id> --tail 80
node scripts/t2d.mjs stop --job <id>
CLI 运行时位于 skills/dsh-task2docker-studio/scripts/lib/(由 scripts/build-portable.mjs 从与 DSH 解耦的 src/backend/ 生成);按 README 说明,复制文件夹即可使用 CLI,无需再 build 插件本体。
适用场景与注意¶
适合谁:已有 SSH 可达的自有或租用机器(云主机、GPU 盒子、集群入口节点等),希望在 Agent 对话里统一完成远程训练、构建测试、隔离跑脚本,并能把产物拉回本机的工作流开发者。
README 列出的限制(v0.2 小节,实现细节以当前仓库为准):
- runner 须从本机 SSH 可达;容器模式要求 runner 上装有 Docker,原生后台执行则不需要。
- 原生后台跑追踪 PID 与日志文件,不能像容器那样一律拿到容器式 exit code。
- 密码认证依赖本机
sshpass。 - 文档中写明尚无专用「大文件传输工具」——除
copy_to/copy_from外,也可自行对 runner 使用 scp/rsync,或在容器中 mount 路径。
版本演进:README 注明 v0.1 曾面向 OpenBayes / HyperAI GraphQL,v0.2 去掉厂商耦合,泛化为任意 SSH runner + 可选 Docker;与 DeepSeek、Docker 或任何云厂商均无隶属或背书关系。
结尾¶
dsh-task2docker-studio 把「远程算力 + 可选 Docker 隔离 + scp + 任务状态/日志」收成 DSH 可调用的工具链,主机保持轻量与安全边界。需要查阅分类与简介时可打开 SkillHub 目录页;安装命令、配置字段与架构说明以 GitHub 仓库 README 为准。