Docker(可选)
Docker 可选。只有在你想用容器化 gateway,或验证 Docker 流程时才需要。Docker 适合我吗?
- 是:你想要一个隔离、可丢弃的 gateway 环境,或在没有本地安装的主机上运行 OpenClaw。
- 否:你在自己的机器上只想要最快的开发循环。请用常规安装流程。
- Sandboxing 说明:agent sandboxing 也会用到 Docker,但不要求 gateway 运行在 Docker 中。见 Sandboxing。
- 容器化 Gateway(完整 OpenClaw in Docker)
- 按会话的 Agent Sandbox(宿主机 gateway + Docker 隔离工具)
要求
- Docker Desktop(或 Docker Engine)+ Docker Compose v2
- 足够磁盘空间存镜像与日志
容器化 Gateway(Docker Compose)
快速开始(推荐)
在仓库根目录:- 构建 gateway 镜像
- 运行 onboarding 向导
- 打印可选的 provider 设置提示
- 通过 Docker Compose 启动 gateway
- 生成 gateway token 并写入
.env
OPENCLAW_DOCKER_APT_PACKAGES— 构建时安装额外 apt 包OPENCLAW_EXTRA_MOUNTS— 添加额外的宿主机 bind mountOPENCLAW_HOME_VOLUME— 使用命名卷持久化/home/node
- 在浏览器打开
http://127.0.0.1:18789/。 - 在 Control UI 中粘贴 token(Settings → token)。
~/.openclaw/~/.openclaw/workspace
手动流程(compose)
额外挂载(可选)
如果你想把更多宿主机目录挂进容器,在运行docker-setup.sh 前设置
OPENCLAW_EXTRA_MOUNTS。它接受逗号分隔的 Docker bind mount 列表,
并通过生成 docker-compose.extra.yml 应用于 openclaw-gateway 和 openclaw-cli。
示例:
- 在 macOS/Windows 上必须先把这些路径共享给 Docker Desktop。
- 如果你修改了
OPENCLAW_EXTRA_MOUNTS,请重新运行docker-setup.sh以重新生成 额外的 compose 文件。 docker-compose.extra.yml是自动生成的,不要手工编辑。
持久化整个容器 home(可选)
如果希望/home/node 在容器重建后仍保持,设置 OPENCLAW_HOME_VOLUME
创建一个命名卷并挂载到 /home/node,同时仍保留标准的 config/workspace 绑定。
这里请用命名卷(而非 bind path);bind mount 请用 OPENCLAW_EXTRA_MOUNTS。
示例:
- 若修改
OPENCLAW_HOME_VOLUME,请重新运行docker-setup.sh以重新生成 额外的 compose 文件。 - 命名卷会一直保留,直到使用
docker volume rm <name>删除。
安装额外 apt 包(可选)
如果你需要镜像内的系统包(如构建工具或媒体库),在运行docker-setup.sh 前设置
OPENCLAW_DOCKER_APT_PACKAGES。它会在镜像构建时安装这些包,即便容器删除也会保留。
示例:
- 该变量接受空格分隔的 apt 包名列表。
- 若修改
OPENCLAW_DOCKER_APT_PACKAGES,请重新运行docker-setup.sh以重建镜像。
更快的重建(推荐)
为了加速重建,请按依赖缓存层来组织 Dockerfile,避免在锁文件不变时 重复运行pnpm install:
Channel setup(可选)
使用 CLI 容器配置各频道,然后按需重启 gateway。 WhatsApp(二维码):Health check
E2E smoke test(Docker)
QR 导入 smoke test(Docker)
备注
- Gateway 绑定在容器场景默认是
lan。 - Gateway 容器是会话的唯一事实来源(
~/.openclaw/agents/<agentId>/sessions/)。
Agent Sandbox(宿主机 gateway + Docker 工具)
深度说明:Sandboxing作用
当启用agents.defaults.sandbox 时,非主会话会在 Docker 容器内运行工具。
Gateway 仍在宿主机上,但工具执行被隔离:
- scope:默认是
"agent"(每个 agent 一个容器 + workspace) - scope:
"session"为每会话隔离 - 每个 scope 的 workspace 挂载到
/workspace - 可选的 agent workspace 访问(
agents.defaults.sandbox.workspaceAccess) - allow/deny 工具策略(deny 优先)
- 入站媒体会复制到活动 sandbox workspace(
media/inbound/*),以便工具读取(workspaceAccess: "rw"时会落到 agent workspace)
scope: "shared" 会禁用跨会话隔离。所有会话共享一个容器与一个 workspace。
按 agent 的 sandbox 配置(多 agent)
如果你使用多 agent 路由,每个 agent 可以覆盖 sandbox 与工具设置:agents.list[].sandbox 和 agents.list[].tools(以及 agents.list[].tools.sandbox.tools)。
这样可以在同一 gateway 内混合不同访问级别:
- 完全访问(个人 agent)
- 只读工具 + 只读 workspace(家庭/工作 agent)
- 无文件系统/ shell 工具(公开 agent)
默认行为
- 镜像:
openclaw-sandbox:bookworm-slim - 每个 agent 一个容器
- Agent workspace 访问:
workspaceAccess: "none"(默认)使用~/.openclaw/sandboxes"ro"让 sandbox workspace 在/workspace,并将 agent workspace 只读挂载到/agent(禁用write/edit/apply_patch)"rw"将 agent workspace 读写挂载到/workspace
- 自动清理:空闲 > 24h 或年龄 > 7d
- 网络:默认
none(需要外联时显式开启) - 默认允许:
exec,process,read,write,edit,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status - 默认拒绝:
browser,canvas,nodes,cron,discord,gateway
启用 sandboxing
如果你计划在setupCommand 中安装包,请注意:
- 默认
docker.network为"none"(无外联)。 readOnlyRoot: true会阻止安装包。user需要是 root 才能apt-get(省略user或设为user: "0:0")。 当setupCommand(或 docker 配置)变更时,OpenClaw 会自动重建容器, 除非该容器刚刚被使用(约 5 分钟内)。热容器会记录警告,并给出 精确的openclaw sandbox recreate ...命令。
agents.defaults.sandbox.docker 下:
network, user, pidsLimit, memory, memorySwap, cpus, ulimits,
seccompProfile, apparmorProfile, dns, extraHosts。
多 agent:可在 agents.list[].sandbox.{docker,browser,prune}.* 中按 agent 覆盖
agents.defaults.sandbox.{docker,browser,prune}.*
(当 agents.defaults.sandbox.scope / agents.list[].sandbox.scope 为 "shared" 时忽略)。
构建默认 sandbox 镜像
Dockerfile.sandbox 构建 openclaw-sandbox:bookworm-slim。
Sandbox common 镜像(可选)
如果你需要带常用构建工具(Node、Go、Rust 等)的 sandbox 镜像,构建 common 镜像:openclaw-sandbox-common:bookworm-slim。使用方式:
Sandbox browser 镜像
要在 sandbox 中运行 browser 工具,构建 browser 镜像:Dockerfile.sandbox-browser 构建 openclaw-sandbox-browser:bookworm-slim。
容器内运行启用 CDP 的 Chromium,并可选 noVNC 观察器(Xvfb 下的 headful)。
注意:
- Headful(Xvfb)比 headless 更不易被拦截。
- 可通过
agents.defaults.sandbox.browser.headless=true使用 headless。 - 不需要完整桌面环境(GNOME);Xvfb 提供显示。
- sandbox browser 控制 URL(用于
browser工具) - noVNC URL(如启用且 headless=false)
browser 加入 allow,并从 deny 中移除,否则该工具仍被阻止。
Prune 规则(agents.defaults.sandbox.prune)也会应用到 browser 容器。
自定义 sandbox 镜像
构建自定义镜像并在配置中引用:工具策略(allow/deny)
deny优先于allow。- 若
allow为空:除 deny 之外的所有工具可用。 - 若
allow非空:仅 allow 中的工具可用(再剔除 deny)。
清理策略
两项参数:prune.idleHours:移除 X 小时未使用的容器(0 = 禁用)prune.maxAgeDays:移除超过 X 天的容器(0 = 禁用)
- 保持活跃会话但限制生命周期:
idleHours: 24,maxAgeDays: 7 - 永不清理:
idleHours: 0,maxAgeDays: 0
安全说明
- 硬隔离只作用于工具(exec/read/write/edit/apply_patch)。
- browser/camera/canvas 等 host-only 工具默认被阻止。
- 在 sandbox 中允许
browser会破坏隔离(browser 在宿主机上运行)。
Troubleshooting
- 镜像缺失:用
scripts/sandbox-setup.sh构建,或设置agents.defaults.sandbox.docker.image。 - 容器未运行:按需会在每个会话自动创建。
- sandbox 内权限错误:将
docker.user设为与挂载 workspace 所有权匹配的 UID:GID (或对 workspace 文件夹执行 chown)。 - 自定义工具找不到:OpenClaw 通过
sh -lc(登录 shell)运行命令,会加载/etc/profile并可能重置 PATH。把docker.env.PATH设置为包含自定义工具路径(例如/custom/bin:/usr/local/share/npm-global/bin),或在 Dockerfile 中添加脚本到/etc/profile.d/。