1. 为什么要把 OpenClaw 关进 Docker 沙盒OpenClaw 这类 AI 编码代理本质上是把一个大模型接上了你本机的文件系统、终端和网络。它能帮你改 Bug、跑测试、执行 Shell 命令效率确实高但它的权限边界和你登录的账号几乎一样大。你在宿主机上跑它等于请了一个能翻你抽屉、能打电话、还能自己决定干什么的实习生进家门。真正让人睡不着的不是它“坏”而是它“太能干”。代理会自己决定读哪个文件、发哪个请求。你把ANTHROPIC_API_KEY或OPENAI_API_KEY写进.env它就有机会读到你挂载了整个用户目录它就能遍历你的 SSH 私钥、云厂商凭证、浏览器 Cookie。一旦 Prompt 被注入或者某个工具调用被诱导密钥就跟着请求一起出去了。Docker 这次给出的思路很直接别在宿主机上裸跑代理把它关进沙盒。沙盒不是普通容器而是跑在 microVM 里的隔离环境有独立内核、受控网络、受限文件访问。更关键的一点是API 密钥由沙盒代理层注入代理进程本身拿不到密钥原文。就算 OpenClaw 被劫持它也没东西可泄露。这篇就按这个思路走一遍用 Docker 把 OpenClaw 容器化接入 TaoToken 统一 Key 通道交付可复制的 Dockerfile、config.toml 骨架、密钥注入方式最后给出容器内验证 API 调用成功的具体命令。适合在本地开发机上跑 AI 代理、又不想让密钥明文躺在宿主机的开发者。2. TaoToken 统一 Key 通道前置准备在把 OpenClaw 塞进沙盒之前先解决密钥管理这件事。传统做法是把各家厂商的 Key 分别写进环境变量OpenClaw 里配一堆 provider。问题是密钥散落、轮换麻烦、代理还能直接读到。TaoToken 提供的是统一 Key/API 通道你只需要一个 Key就能走通多家模型的调用配置面收敛成一处。对沙盒场景来说这一点很重要。因为密钥注入点越少越容易做到“代理进程看不到原文”。你可以把 TaoToken 的 Key 放在宿主机的环境变量或 Docker secret 里由容器启动时注入OpenClaw 的 config.toml 里只引用一个本地代理地址不出现任何真实 Key。先拿到统一 Key。打开控制台在 API Keys 页面创建一个新 Key复制保存。这个 Key 后面会通过环境变量传给容器不会写进镜像也不会写进 config.toml。控制台入口https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI 基地址统一用https://taotoken.net/api这个地址不加 UTM直接写进配置即可。模型名按文档里的写法填比如claude-sonnet-4-5、gpt-4o这类具体以文档为准。如果你只是想先验证模型通不通可以先用模型对话页面发一条消息试试模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite如果你打算长期用 OpenClaw 做编码和 Agent 任务建议直接上 Coding Plan额度更划算也省得每次单独配 KeyCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite前置准备就这些一个 TaoToken Key、一个 API 基地址、一个模型名。接下来进 Docker。3. 可复制的 Dockerfile 与 config.toml 骨架这一节给的是能直接抄的骨架。思路是基础镜像用 Node.js 22装 OpenClaw创建一个非 root 用户把工作区限制在/workspace密钥通过运行时环境变量注入config.toml 里只引用本地地址。先看 DockerfileFROM node:22-bookworm-slim # 基础工具按需增减 RUN apt-get update apt-get install -y --no-install-recommends \ git curl ca-certificates ripgrep \ rm -rf /var/lib/apt/lists/* # 安装 OpenClaw以实际包名为准这里用 npm 全局安装示意 RUN npm install -g openclawlatest # 创建非 root 用户代理不以 root 跑 RUN useradd -m -u 10001 claw \ mkdir -p /workspace /home/claw/.config/openclaw \ chown -R claw:claw /workspace /home/claw USER claw WORKDIR /workspace # 只暴露本地桥接端口不暴露任何外部服务 EXPOSE 54321 # 启动脚本负责读取环境变量并拉起 OpenClaw COPY --chownclaw:claw start-openclaw.sh /home/claw/start-openclaw.sh RUN chmod x /home/claw/start-openclaw.sh ENTRYPOINT [/home/claw/start-openclaw.sh]这里有几个刻意的设计。第一用node:22-bookworm-slim而不是完整镜像减少攻击面。第二创建claw用户UID 10001避免容器内进程以 root 身份运行。第三工作区固定为/workspace宿主机只挂载这一个目录进去其他路径代理碰不到。第四不把任何 Key 写进镜像层镜像可以安全推送到 Registry。再看 config.toml 骨架。OpenClaw 的配置文件名和字段以实际版本为准这里给的是结构示意核心是base_url指向 TaoTokenapi_key从环境变量读取# /home/claw/.config/openclaw/config.toml [provider] name taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 只引用环境变量名不写明文 default_model claude-sonnet-4-5 [agent] workspace /workspace allow_shell true allow_network true max_file_size_mb 20 [network] # 所有出站请求走本地桥接由桥接转发到沙盒代理 proxy http://127.0.0.1:54321注意api_key_env这个字段。它告诉 OpenClaw 去读环境变量TAOTOKEN_API_KEY而不是把 Key 写在文件里。这样即使 config.toml 被代理读到里面也没有密钥原文。真正的 Key 在容器启动时由docker run -e或--env-file注入只存在于进程环境里。启动脚本start-openclaw.sh做两件事检查环境变量是否存在然后拉起 OpenClaw#!/usr/bin/env bash set -euo pipefail if [ -z ${TAOTOKEN_API_KEY:-} ]; then echo ERROR: TAOTOKEN_API_KEY is not set 2 exit 1 fi # 启动本地桥接示意实际按 OpenClaw 网络方案实现 # node /home/claw/bridge.js exec openclaw --config /home/claw/.config/openclaw/config.toml构建镜像docker build -t openclaw-sandbox:latest .到这里镜像里没有任何密钥config.toml 里也没有明文。密钥只在运行时注入。4. 密钥注入与容器启动密钥注入有三种常见方式按安全程度从低到高排-e直接传、--env-file读文件、Docker secret。本地开发用--env-file就够生产或团队共享建议用 secret。先准备一个.env文件放在宿主机上权限设成 600不要提交到 Git# ~/.openclaw-secrets.env TAOTOKEN_API_KEYsk-你的真实Keychmod 600 ~/.openclaw-secrets.env启动容器只挂载工作区注入环境变量docker run -d \ --name openclaw \ --env-file ~/.openclaw-secrets.env \ -v $PWD/workspace:/workspace \ -p 127.0.0.1:54321:54321 \ openclaw-sandbox:latest几个关键点。-v只挂载当前目录下的workspace不要挂载$HOME或/。-p绑定到127.0.0.1不要用0.0.0.0避免局域网其他机器访问。--env-file让 Key 只进入容器进程环境不落盘到镜像。如果你用的是 Docker SandboxmicroVM 方案启动方式类似但隔离级别更高docker sandbox create --name openclaw -t openclaw-sandbox:latest shell docker sandbox network proxy openclaw --allow-host taotoken.net docker sandbox run openclaw这里--allow-host taotoken.net是网络白名单只允许代理访问 TaoToken 的域名其他出站请求一律拒绝。这样即使 OpenClaw 想往别的地方发数据也发不出去。验证容器起来了docker ps --filter nameopenclaw docker logs openclaw --tail 50如果日志里出现TAOTOKEN_API_KEY is not set说明环境变量没注入成功检查.env文件路径和--env-file参数。5. 容器内验证 API 调用成功容器跑起来后别急着让 OpenClaw 干活先在容器内验证 TaoToken 通道是通的。这一步能帮你把“密钥问题”和“代理问题”分开排查。进入容器docker exec -it openclaw bash在容器内用 curl 直接打 TaoToken 的 API确认 Key 有效、网络可达curl -sS https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-5, messages: [{role: user, content: ping}], max_tokens: 16 }如果返回里有choices字段和一段回复内容说明通道通了。如果返回 401检查 Key 是否正确、是否有多余空格。如果返回 403 或超时检查沙盒网络白名单是否放行了taotoken.net。再验证 OpenClaw 本身能不能读到配置openclaw --config /home/claw/.config/openclaw/config.toml doctor不同版本命令可能不同核心是看它能不能解析 config.toml、能不能读到TAOTOKEN_API_KEY环境变量。如果 doctor 报“api key not found”说明api_key_env字段名和实际环境变量名不一致。最后跑一个最小任务让 OpenClaw 在/workspace里创建一个文件openclaw --config /home/claw/.config/openclaw/config.toml \ run 在 /workspace 下创建 hello.txt内容为 hello from sandbox然后退出容器在宿主机检查cat workspace/hello.txt如果文件出现了说明整条链路通了OpenClaw 在沙盒里运行通过 TaoToken 通道调用模型写文件被限制在挂载的工作区密钥没有出现在任何配置文件里。6. 本篇常见错排查错误一TAOTOKEN_API_KEY is not set容器启动时环境变量没注入。检查--env-file路径是否正确文件里是否有TAOTOKEN_API_KEY这一行等号两边不要有空格。用docker exec openclaw env | grep TAOTOKEN确认变量是否真的进了容器。错误二curl 返回 401 UnauthorizedKey 无效或格式不对。去 API Keys 页面重新复制一次注意不要带换行。如果 Key 是从网页复制的有时会带上不可见字符用echo -n $TAOTOKEN_API_KEY | wc -c看长度是否和预期一致。错误三curl 超时或连接被拒沙盒网络白名单没放行taotoken.net。如果你用的是 Docker Sandbox执行docker sandbox network proxy openclaw --allow-host taotoken.net。如果是普通容器检查宿主机网络和 DNS容器内curl -I https://taotoken.net看能不能通。错误四OpenClaw 报config parse errorconfig.toml 字段名和版本不匹配。不同版本的 OpenClaw 配置结构可能有差异以接入文档为准。先用最小配置跑通再逐步加字段。文档入口https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite错误五代理能读到宿主机文件挂载范围开太大了。检查docker run的-v参数只挂载工作区目录不要挂载$HOME、/etc、/var/run/docker.sock。docker.sock尤其危险挂进去等于把宿主机 Docker 控制权交给了代理。错误六容器内 localhost 指向不对如果你在容器内配置了proxy http://127.0.0.1:54321但桥接脚本没起来请求会失败。确认桥接进程在容器内运行或者把 proxy 指向host.docker.internal对应的宿主机地址。Node.js 不遵循HTTP_PROXY环境变量所以桥接脚本是必要的。错误七密钥出现在docker inspect里用-e直接传 Key 时docker inspect能看到明文。改用--env-file或 Docker secret并且限制能执行docker inspect的用户范围。本地开发机上问题不大团队共享环境要注意。7. 把 Key 通道固定下来沙盒解决的是“代理能碰什么”TaoToken 解决的是“密钥怎么管”。两件事合起来才是完整的边界文件访问被限制在工作区网络请求经过白名单密钥由运行时注入、代理进程读不到原文。如果你只是偶尔跑一下 OpenClaw按上面的 Dockerfile 和 config.toml 骨架走一遍就够了。如果你打算长期用它做编码和 Agent 任务建议把 Coding Plan 配上统一 Key 通道省得每次换模型都要改配置Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite接入过程中遇到配置问题先查接入文档再对照本篇的排障清单接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite最后留一个实操建议把.env文件加到.gitignore把workspace目录单独管理镜像构建和密钥注入分成两步。这样你的 OpenClaw 沙盒可以随时重建密钥不会跟着镜像跑代理也不会在你不知情的时候碰到不该碰的东西。