xunc · 容器会话¶
在 Docker 容器里运行 xuns,宿主只负责创建容器、转发环境变量并把输出接回终端。
git clone https://github.com/MenxLi/xun.git
cd xun
make build-docker # 先构建前端,再 docker build -t xun -f docker/Dockerfile .
xunc # 沙箱:容器内的临时工作区
xunc . # 把当前目录绑定为容器内 /workspace
xunc --copy . # 把当前目录复制进 /workspace(不回写宿主)
参数¶
| 参数 | 形式 | 默认 | 说明 |
|---|---|---|---|
mount |
位置参数,可选 | 不挂载 | 绑定为容器内 /workspace 的宿主目录(会先 resolve()) |
--copy |
开关 | False |
改为把该目录复制进 /workspace;未给 mount 时报错 |
--image |
字符串 | xun |
使用的镜像 |
--name |
字符串 | xun-<md5前8位> |
容器名;默认哈希取自 mount 路径(未挂载时取镜像名) |
--network |
bridge / host |
bridge |
bridge 会发布 --port 端口;host 共享宿主网络命名空间(macOS 上是 Docker VM 的,宿主浏览器打不开) |
--port |
字符串列表 | 18960 |
需要发布到宿主的端口,支持逗号分隔或多次传入;--port "" 表示不发布任何端口 |
--env |
字符串列表 | 空 | 逗号分隔:NAME=VALUE 直接赋值;不含 = 的 token 作为通配符从宿主转发 |
--exec |
字符串 | 见下 | 容器内执行的命令;空串表示使用镜像默认 CMD |
--exec 未指定时:给了 mount 用 xuns . --host 0.0.0.0(位置参数 . 即 /workspace,会话工作区就是挂载点),否则用 xuns '' --host '0.0.0.0'(每个会话一个临时工作区)。
工作目录的三种形态¶
| 写法 | 容器内 /workspace |
数据去向 |
|---|---|---|
xunc |
镜像自带的空目录 | 容器销毁即消失 |
xunc . |
绑定挂载(读写) | 直接落在宿主目录,可回写 |
xunc --copy . |
复制副本 | 容器内的修改不会回传宿主 |
只要给了 mount,容器的 working_dir 也会被设为 /workspace,因此容器内智能体的当前目录与挂载点始终一致。
环境变量转发¶
XUN_* 与 _XUN_* 总是转发进容器,无需显式声明。--env 在此基础上追加:
xunc . --env "XUN_AUTO_CONFIRM=true,_XUN_DEFAULT_MAX_ITER=384,HTTPS_PROXY"
NAME=VALUE:直接赋值- 裸
NAME或MY_*:按 fnmatch 从宿主环境转发 XUN_HOME不可覆盖(镜像内固定为/.xun),强行赋值会打印告警并忽略
xun home 的复制¶
容器创建时会把宿主的 xun home($XUN_HOME,未设置时为宿主当前目录下的 .xun/)复制进容器 /.xun,只取 config.json 与 extensions/(HOME_COPY_INCLUDE)——会话历史与 x/(xunx 的用户库)不会被带走。这就是为什么容器里也能读到同一份密钥占位符与扩展。
生命周期与输出¶
容器以 auto_remove=True、stdin_open、tty 创建,working_dir=/workspace(挂载时)。xunc 把宿主 stdin 转发进容器、把容器输出回显到宿主;Ctrl+C 之后容器被强制移除。因此浏览器里看到的 URL 是容器内 xuns 打印的:
Agents are available at the following URLs:
http://0.0.0.0:18960/chat/?session=%2F&token=... (aka http://localhost:18960/chat/?...)
bridge 模式下宿主端口与容器端口相同(默认发布 18960),所以照抄 localhost:18960 那一条即可;--port "" 时没有可访问端口,适合纯 --exec 的一次性任务,例如本仓库生成文档的用法:
xunc . \
--env "XUN_AUTO_CONFIRM=true,_XUN_DEFAULT_MAX_ITER=384" \
--exec "xun --non-interactive '请按照docs/AGENTS.md的要求制作文档'" \
--name "xun-doc" \
--port ""
仓库的 Makefile 把这种一次性用法固化成了两条命令:make doc(首次制作双语文档)与 make doc-update(按源码最近的变动更新文档)。两者都只传 --env "XUN_AUTO_CONFIRM=true"(不像上面的示例还转发了 _XUN_DEFAULT_MAX_ITER),只有 --exec 提示词不同。
容器即用即删
xunc 的容器在退出后自动删除,容器内的临时工作区、已保存会话都会丢失。需要留存数据请使用绑定挂载(xunc .),或改用持久化的 xunx。