DockerDocker
Docker 是可选的。仅当您想要容器化网关或验证 Docker 流程时才使用它。
Docker 适合我吗?
Section titled “Docker 适合我吗?”- 适合:您想要一个隔离的、用完即弃的网关环境,或者希望在无需本地安装的主机上运行 OpenClaw。
- 不适合:您在您自己的机器上运行,只想要最快的开发循环。请改用常规安装流程。
- 沙箱注意事项:启用沙箱时,默认的沙箱后端使用 Docker,但沙箱默认处于关闭状态,并且不要求整个网关在 Docker 中运行。此外也提供 SSH 和 OpenShell 沙箱后端。请参阅 沙箱隔离。
- Docker Desktop(或 Docker Engine)+ Docker Compose v2
- 镜像构建至少需要 2 GB RAM(在 1 GB 主机上,
pnpm install可能会因内存不足 OOM 被杀死并以退出码 137 终止) - 足够的磁盘空间用于镜像和日志
- 如果在 VPS/公共主机上运行,请查看
网络暴露的安全加固,
特别是 Docker
DOCKER-USER防火墙策略。
构建镜像
从仓库根目录运行安装脚本:
Terminal window ./scripts/docker/setup.sh这将在本地构建网关镜像。要改用预构建的镜像:
Terminal window export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"./scripts/docker/setup.sh预构建的镜像发布于 GitHub Container Registry。 常用标签:
main、latest、`(例如2026.2.26`)。完成新手引导
安装脚本会自动运行新手引导。它将:
- 提示输入提供商 API 密钥
- 生成网关令牌并将其写入
.env - 创建 auth-profile 密钥目录
- 通过 Docker Compose 启动网关
在设置期间,启动前的引导和配置写入直接通过
openclaw-gateway运行。openclaw-cli用于在网关容器已经存在后 运行的命令。打开控制 UI
在浏览器中打开
http://127.0.0.1:18789/并将配置的 共享密钥粘贴到设置中。安装脚本默认会将令牌写入.env; 如果将容器配置切换为密码验证,请改用该密码。需要再次获取 URL?
Terminal window docker compose run --rm openclaw-cli dashboard --no-open配置频道(可选)
使用 CLI 容器添加消息频道:
Terminal window # WhatsApp (QR)docker compose run --rm openclaw-cli channels login# Telegramdocker compose run --rm openclaw-cli channels add --channel telegram --token "”
# Discorddocker compose run --rm openclaw-cli channels add --channel discord --token "” ```
文档:[WhatsApp](/zh/channels/whatsapp)、[Telegram](/zh/channels/telegram)、[Discord](/zh/channels/discord)
如果您希望自行运行每个步骤而不是使用安装脚本:
docker build -t openclaw:local -f Dockerfile .docker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js onboard --mode local --no-install-daemondocker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'docker compose up -d openclaw-gateway安装脚本接受这些可选的环境变量:
| 变量 | 用途 |
|---|---|
OPENCLAW_IMAGE | 使用远程镜像而不是在本地构建 |
OPENCLAW_IMAGE_APT_PACKAGES | 在构建期间安装额外的 apt 软件包(以空格分隔) |
OPENCLAW_IMAGE_PIP_PACKAGES | 在构建期间安装额外的 Python 包(空格分隔) |
OPENCLAW_EXTENSIONS | 在构建时预安装插件依赖项(空格分隔的名称) |
OPENCLAW_EXTRA_MOUNTS | 额外的主机绑定挂载(逗号分隔的 source:target[:opts]) |
OPENCLAW_HOME_VOLUME | 将 /home/node 持久化在命名的 Docker 卷中 |
OPENCLAW_SANDBOX | 选择加入沙箱引导(1、true、yes、on) |
OPENCLAW_SKIP_ONBOARDING | 跳过交互式新手引导步骤(1、true、yes、on) |
OPENCLAW_DOCKER_SOCKET | 覆盖 Docker 套接字路径 |
OPENCLAW_DISABLE_BONJOUR | 禁用 Bonjour/mDNS 广播(对于 Docker 默认为 1) |
OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS | 禁用捆绑插件源绑定挂载覆盖 |
OTEL_EXPORTER_OTLP_ENDPOINT | 用于 OpenTelemetry 导出的共享 OTLP/HTTP 收集器端点 |
OTEL_EXPORTER_OTLP_*_ENDPOINT | 用于跟踪、指标或日志的特定 Signal OTLP 端点 |
OTEL_EXPORTER_OTLP_PROTOCOL | 覆盖 OTLP 协议。目前仅支持 http/protobuf |
OTEL_SERVICE_NAME | 用于 OpenTelemetry 资源的服务名称 |
OTEL_SEMCONV_STABILITY_OPT_IN | 选择启用最新的实验性 GenAI 语义属性 |
OPENCLAW_OTEL_PRELOADED | 如果已预加载一个 OpenTelemetry SDK,则跳过启动第二个 SDK |
官方 Docker 镜像不附带 Homebrew。在 OpenClaw 新手引导期间,当它在没有 brew 的 Linux 容器中运行时,会隐藏仅限 brew 的技能依赖安装程序;这些依赖项必须由自定义镜像提供或手动安装。对于 Debian 软件包中可用的依赖项,请在镜像构建期间使用 OPENCLAW_IMAGE_APT_PACKAGES。旧的 OPENCLAW_DOCKER_APT_PACKAGES 名称仍然被接受。
对于 Python 依赖项,请使用 OPENCLAW_IMAGE_PIP_PACKAGES。这会在镜像构建期间运行 python3 -m pip install --break-system-packages,因此请固定软件包版本并仅使用您信任的软件包索引。
维护人员可以通过将一个插件源目录挂载到其打包的源路径(例如 OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro),来针对打包镜像测试捆绑插件源。
该挂载的源目录会覆盖同一插件 ID 的匹配编译 /app/dist/extensions/synology-chat 包。
OpenTelemetry 导出是从 Gateway(网关) 容器出站到您的 OTLP 收集器的。它不需要已发布的 Docker 端口。如果您在本地构建镜像并希望镜像内部可使用捆绑的 OpenTelemetry 导出器,请包含其运行时依赖项:
export OPENCLAW_EXTENSIONS="diagnostics-otel"export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"export OTEL_SERVICE_NAME="openclaw-gateway"./scripts/docker/setup.sh在启用导出之前,请从 ClawHub 在打包的 Docker 安装中安装官方 @openclaw/diagnostics-otelClawHubDocker 插件。自定义源构建的镜像仍可以通过 OPENCLAW_EXTENSIONS=diagnostics-otel 包含本地插件源。要启用导出,请在配置中允许并启用 diagnostics-otel 插件,然后设置 diagnostics.otel.enabled=true 或使用 OpenTelemetry 导出 中的配置示例。Collector 认证标头通过 diagnostics.otel.headersDocker 配置,而不是通过 Docker 环境变量。
Prometheus 指标使用已发布的 Gateway(网关) 端口。安装 Gateway(网关)clawhub:@openclaw/diagnostics-prometheus,启用 diagnostics-prometheus 插件,然后抓取:
http://<gateway-host>:18789/api/diagnostics/prometheus该路由受 Gateway(网关) 身份验证保护。不要公开单独的公共 Gateway(网关)/metrics 端口或未经身份验证的反向代理路径。请参阅 Prometheus 指标。
容器探测端点(无需身份验证):
curl -fsS http://127.0.0.1:18789/healthz # livenesscurl -fsS http://127.0.0.1:18789/readyz # readinessDocker 镜像包含一个内置的 DockerHEALTHCHECK,用于 ping /healthzDocker。如果检查持续失败,Docker 会将容器标记为 unhealthy,编排系统可以重新启动或替换它。
经过身份验证的深度健康快照:
docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"局域网 vs 回环
Section titled “局域网 vs 回环”scripts/docker/setup.sh 默认为 OPENCLAW_GATEWAY_BIND=lan,以便主机对 http://127.0.0.1:18789Docker 的访问可以通过 Docker 端口发布正常工作。
lanCLI(默认):主机浏览器和主机 CLI 可以访问已发布的 gateway 端口。loopback:只有容器网络命名空间内的进程才能直接访问 gateway。
主机本地提供商
Section titled “主机本地提供商”当 OpenClaw 在 Docker 中运行时,容器内的 127.0.0.1 是容器
本身,而不是您的主机。对于在主机上运行的 AI 提供商,请使用 host.docker.internal:
| 提供商 | 主机默认 URL | Docker 设置 URL |
|---|---|---|
| LM Studio | http://127.0.0.1:1234 | http://host.docker.internal:1234 |
| Ollama | http://127.0.0.1:11434 | http://host.docker.internal:11434 |
附带的 Docker 设置使用这些主机 URL 作为 LM Studio 和 Ollama
新手引导的默认值,并且 docker-compose.yml 将 host.docker.internal 映射到
Linux Docker 引擎的 LinuxDocker 主机网关。Docker Desktop 已在 macOS 和 Windows 上提供了相同的主机名。
主机服务还必须监听可从 Docker 访问的地址:
lms server start --port 1234 --bind 0.0.0.0OLLAMA_HOST=0.0.0.0:11434 ollama serve如果您使用自己的 Compose 文件或 docker run 命令,请自行添加相同的主机
映射,例如
--add-host=host.docker.internal:host-gateway。
Bonjour / mDNS
Section titled “Bonjour / mDNS”Docker 桥接网络通常无法可靠地转发 Bonjour/mDNS 多播
(224.0.0.251:5353)。因此,附带的 Compose 设置默认
OPENCLAW_DISABLE_BONJOUR=1,以防止当桥接丢弃多播流量时 Gateway(网关) 发生崩溃循环或重复
重启广告。
对 Docker 主机使用已发布的 Gateway(网关) URL、Tailscale 或广域 DNS-SD。
仅在运行主机网络、macvlan 或已知 mDNS 组播有效的其他网络时设置 Gateway(网关)TailscaleDockerOPENCLAW_DISABLE_BONJOUR=0。
有关注意事项和故障排除,请参阅 Bonjour 发现。
存储和持久性
Section titled “存储和持久性”Docker Compose 将 DockerOPENCLAW_CONFIG_DIR 绑定挂载到 /home/node/.openclaw,
将 OPENCLAW_WORKSPACE_DIR 绑定挂载到 /home/node/.openclaw/workspace,并将
OPENCLAW_AUTH_PROFILE_SECRET_DIR 绑定挂载到 /home/node/.config/openclaw,因此这些
路径在容器替换后得以保留。当任何变量未设置时,捆绑的
docker-compose.yml 会回退到 ${HOME} 下,或者在 HOME 本身
也缺失时回退到 /tmp。这可以防止 docker compose up 在裸机环境中发出空源
卷规范。
该挂载的配置目录是 OpenClaw 存放以下内容的位置:
openclaw.json用于行为配置agents/<agentId>/agent/auth-profiles.jsonOAuthAPI 用于存储提供商 OAuth/API 密钥的身份验证.env用于环境变量支持的运行时密钥(例如OPENCLAW_GATEWAY_TOKEN)
身份配置文件密钥目录存储用于 OAuth 支持的身份配置文件令牌材料的本地加密密钥。请将其与 Docker 主机状态一起保存,但与 OAuthDockerOPENCLAW_CONFIG_DIR 分开存放。
已安装的可下载插件将其包状态存储在挂载的 OpenClaw 主目录下,因此插件安装记录和包根目录在容器替换后得以保留。Gateway(网关) 启动不会生成捆绑插件的依赖树。
有关 VM 部署的完整持久性详细信息,请参阅 Docker VM Runtime - 持久化内容位置。
磁盘增长热点: 请关注 media/、会话 JSONL 文件、
cron/runs/*.jsonl、已安装的插件包根目录以及 /tmp/openclaw/ 下的滚动文件日志。
Shell 辅助脚本(可选)
Section titled “Shell 辅助脚本(可选)”为了更轻松地进行日常 Docker 管理,请安装 ClawDock:
mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.shecho 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc如果您是从旧的 scripts/shell-helpers/clawdock-helpers.sh 原始路径安装的 ClawDock,请重新运行上述安装命令,以便您的本地辅助文件跟踪新位置。
然后使用 clawdock-start、clawdock-stop、clawdock-dashboard 等。运行
clawdock-help 查看所有命令。
请参阅 ClawDock 获取完整的辅助指南。
为 Docker 网关启用代理沙箱
export OPENCLAW_SANDBOX=1./scripts/docker/setup.sh自定义套接字路径(例如无根 Docker):
export OPENCLAW_SANDBOX=1export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock./scripts/docker/setup.sh该脚本仅在沙箱先决条件通过后才挂载 docker.sock。如果
沙箱设置无法完成,脚本会将 agents.defaults.sandbox.mode
重置为 off。当 OpenClaw 沙箱处于活动状态时,Codex 代码模式轮次仍受限于 Codex
workspace-write;请勿将主机 Docker 套接字挂载到代理沙箱容器中。
自动化 / CI(非交互式)
使用 -T 禁用 Compose 伪 TTY 分配:
docker compose run -T --rm openclaw-cli gateway probedocker compose run -T --rm openclaw-cli devices list --json共享网络安全说明
openclaw-cli 使用 network_mode: "service:openclaw-gateway",因此 CLI 命令可以通过 127.0.0.1 访问网关。请将此视为共享信任边界。Compose 配置会丢弃 NET_RAW/NET_ADMIN 并在 openclaw-gateway 和 openclaw-cli 上启用 no-new-privileges。
Docker%PH:GLOSSARY:338:da7a16c0%% Desktop 中 openclaw-cli 的 DNS 故障
某些 Docker Desktop 设置在丢弃 NET_RAW 后,无法从共享网络 openclaw-cli 边车进行 DNS 查找,这会在 npm 支持的命令(例如 openclaw plugins install)中显示为 EAI_AGAIN。
对于正常的网关操作,请保留默认的加固 compose 文件。下面的本地覆盖通过恢复 CLI 的默认功能来放宽 Docker 容器的安全姿态,因此请仅在需要包注册表访问的一次性 CLI 命令中使用它,而不要将其作为默认的 Compose 调用方式:
printf '%s\n' \ 'services:' \ ' openclaw-cli:' \ ' cap_drop: !reset []' \ > docker-compose.cli-no-dropped-caps.local.yml
docker compose -f docker-compose.yml -f docker-compose.cli-no-dropped-caps.local.yml run --rm openclaw-cli plugins install如果您已经创建了长时间运行的 `openclaw-cli` 容器,请使用相同的覆盖重新创建它。`docker compose exec` 和 `docker exec` 无法在已创建的容器上更改 Linux 功能。Permissions and EACCES
该镜像以 node (uid 1000) 身份运行。如果您在
/home/node/.openclaw 上遇到权限错误,请确保您的主机绑定挂载归 uid 1000 所有:
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace相同的不匹配也可能显示为插件警告,例如
blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root)
紧接着是 plugin present but blocked。这意味着进程 uid 与
已挂载的插件目录所有者不一致。建议以默认 uid 1000
运行容器并修复绑定挂载的所有权。仅在您打算长期以
root 身份运行 OpenClaw 时,才将 /path/to/openclaw-config/npm chown
给 root:root。
Faster rebuilds
请对您的 Dockerfile 进行排序,以便缓存依赖层。这避免了重新运行
pnpm install,除非锁定文件发生更改:
FROM node:24-bookwormRUN curl -fsSL https://bun.sh/install | bashENV PATH="/root/.bun/bin:${PATH}"RUN corepack enableWORKDIR /appCOPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./COPY ui/package.json ./ui/package.jsonCOPY scripts ./scriptsRUN pnpm install --frozen-lockfileCOPY . .RUN pnpm buildRUN pnpm ui:installRUN pnpm ui:buildENV NODE_ENV=productionCMD ["node","dist/index.js"]Power-user container options
默认镜像以安全为优先,并以非 root node 身份运行。若要获得功能更
全面的容器:
- 持久化
/home/node:export OPENCLAW_HOME_VOLUME="openclaw_home" - 预装系统依赖:
export OPENCLAW_IMAGE_APT_PACKAGES="git curl jq" - 预装 Python 依赖:
export OPENCLAW_IMAGE_PIP_PACKAGES="requests==2.32.5 humanize==4.14.0" - 预装 Playwright Chromium:
export OPENCLAW_INSTALL_BROWSER=1 - 或将 Playwright 浏览器安装到持久化卷中:
Terminal window docker compose run --rm openclaw-cli \node /app/node_modules/playwright-core/cli.js install chromium - 持久化浏览器下载:使用
OPENCLAW_HOME_VOLUME或OPENCLAW_EXTRA_MOUNTS。OpenClaw 会自动检测 Docker 镜像在 Linux 上 由 Playwright 管理的 Chromium。
OpenAIOAuthDockerOpenAI Codex OAuth (无头 Docker)
如果你在向导中选择了 OpenAI Codex OAuth,它会打开一个浏览器 URL。在 Docker 或无头设置中,复制你跳转到的完整重定向 URL 并将其 粘贴回向导以完成身份验证。
基础镜像元数据
主 Docker 运行时镜像使用 node:24-bookworm-slim 并包含 tini 作为入口点初始化进程 (PID 1),以确保回收僵尸进程并在长时间运行的容器中正确处理信号。它发布 OCI 基础镜像注解,包括 org.opencontainers.image.base.name、
org.opencontainers.image.sourceDocker 等。Node 基础摘要
通过 Dependabot Docker 基础镜像 PR 刷新;发布构建不运行
发行版升级层。请参阅
OCI image annotations。
在 VPS 上运行?
Section titled “在 VPS 上运行?”请参阅 Hetzner (Docker VPS) 和 Docker VM Runtime 了解共享 VM 部署步骤, 包括二进制文件制作、持久化和更新。
Agent 沙箱
Section titled “Agent 沙箱”当使用 Docker 后端启用 agents.defaults.sandboxDockerDocker 时,网关
在独立的 Docker 容器内运行代理工具执行(Shell、文件读/写等),而网关本身则保持在主机上。这为你提供了一道坚固的屏障,
用于隔离不受信任或多租户代理会话,而无需将整个
网关容器化。
沙箱范围可以是每个代理(默认)、每个会话或共享的。每个范围
都有自己的工作区,挂载于 /workspace。你还可以配置
允许/拒绝工具策略、网络隔离、资源限制和浏览器
容器。
有关完整的配置、镜像、安全说明和多代理配置文件,请参阅:
{ agents: { defaults: { sandbox: { mode: "non-main", // off | non-main | all scope: "agent", // session | agent | shared }, }, },}构建默认沙箱镜像(从源代码检出):
scripts/sandbox-setup.sh对于没有源代码检出的 npm 安装,请参阅 沙箱隔离 § 镜像和设置 中的内联 docker build 命令。
镜像缺失或沙箱容器无法启动
使用
scripts/sandbox-setup.sh
(源代码检出)或 沙箱隔离 § 镜像和设置 (npm 安装)中的内联 docker build 命令构建沙箱镜像,
或者将 agents.defaults.sandbox.docker.image 设置为您的自定义镜像。
容器会根据需要按会话自动创建。
沙箱中的权限错误
将 docker.user 设置为与您挂载的工作区所有权匹配的 UID:GID, 或对工作区文件夹执行 chown 操作。
在沙箱中找不到自定义工具
OpenClaw 使用 sh -lc (登录 Shell)运行命令,该操作会 source /etc/profile 并可能会重置 PATH。设置 docker.env.PATH 以在前面添加您的 自定义工具路径,或在您的 Dockerfile 中的 /etc/profile.d/ 下添加脚本。
镜像构建期间因内存不足被杀死 (exit 137)
虚拟机至少需要 2 GB RAM。使用更大规格的机器并重试。
Unauthorized or pairing required in Control UI
获取一个新的仪表板链接并批准浏览器设备:
docker compose run --rm openclaw-cli dashboard --no-opendocker compose run --rm openclaw-cli devices listdocker compose run --rm openclaw-cli devices approve更多详情:[仪表板](/zh/web/dashboard)、[设备](/zh/cli/devices)。Gateway(网关) 目标显示 ws://172.x.x.x 或来自 Docker CLI 的配对错误
重置 Gateway 模式和绑定:
docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789