前言

我在 🦞安卓党的AI突围:Oracle 24G+4 VPS 部署 OpenClaw 深度指南 (2026版) | Luznest (光巢) 这篇文章里介绍用docker的方式部署OpenClaw。Docker能把能力强大,破坏力也同样强大的OpenClaw限制在沙盒环境,不会在电脑上造成不可挽回的损失。

但是这种沙盒环境限制也不是没有代价。官方镜像为了体积和通用性,不得不阉割掉笨重的浏览器内核和数据库等系列工具。使用Docker方式部署OpenClaw处理各种事情时,我常常经历那种“明明差临门一脚,它却卡在环境限制上”的挫败感。

比如说,本想让它去读一篇微信公众号文章解析,它却对着反爬 JS 报错;本想让它帮你整理过去一年的健康数据,它却只能在几千行的 Markdown 文件里左右支绌。你想让它帮你分析最近Anki刷卡记录,它却告诉你只能读文本文档。

这种时候,你就会意识到:官方原生镜像只是一个基础的毛坯房。 我们要的是一个能干脏活、能处理复杂任务的“完全体”。所以,我们要给它打个“补丁”——这不是在改代码,而是在给 AI 的灵魂,重新焊接一副更强壮的肉身。

为什么要费这个劲?关于“视力”与“仓库”的隐喻

在动手之前,我们得先搞清楚,我们到底在补什么。

第一,是加装“视力”。 现在的网页很少有静态页面。微信、小红书,它们全是靠 JavaScript 动态生成的。如果你只给 AI 提供一个 curl(就像是给它一根导盲棍),它只能在黑暗里摸索。 我们要装的 Playwright 和 Chromium,就是给 AI 装上一对实实在在的“数字化眼睛”。它能真正打开浏览器,等广告弹窗消失,等内容渲染完成,甚至能模拟你的手指去点击。

第二,是建立“仓库”。 Markdown 是很好的笔记格式,但它不是好的数据引擎。当你试图把上万行的 Garmin 手表睡眠记录塞给 AI 时,它的 Token 窗口会瞬间被垃圾信息填满。 我们要装的 sqlite3,就是给 AI 建一个地下仓库。数据不再是无序流动的文字,而是结构化的、可索引的表格。AI 查数据不再靠“读”,而是靠“检”。

更深一层的意义在于:很多硬核工具的底层,其实都是 SQLite。 比如你每天背的 Anki 牌组,它的学习进度和遗忘曲线就躺在 .anki2 数据库里。有了这个工具,AI 就能直接读取你的知识库,知道你哪些单词还没记牢,从而在对话中精准地为你进行“主动回想(Active Recall)”。这种从生理数据到认知数据的全面建模,才是真正让 AI “认识”你的开始。

第三,是通往“三上编程”的门票。 我之前提过“三上编程”(车上、路上、厕上)。要实现这种丝滑的自动化,你的 Agent 必须在服务器后台能够自主完成文件同步(rclone)。我们需要它把沙盒环境里写的文件自动共享到沙盒环境外,也就我们的电脑本地,却又不破坏安全限制。

这套组合拳,才是通往 Vibe Coding 自由的关键。

动手:在 Docker 镜像之上“盖楼”

我们采用的是 Docker 的“层叠”策略。这是一种优雅的折腾方式:你不需要碰 OpenClaw 的源码,只需以它为基石,盖上我们自己的功能层。

第一步:环境的“骨龄检测”

在 VPS 的终端里,先确认一下官方OpenClaw镜像的底子。这一步决定了我们后面装包的策略。

docker run --rm -it ghcr.io/openclaw/openclaw:latest sh -lc 'cat /etc/os-release'

大部分情况下,你会看到 Debian 12 (bookworm)。这意味着我们的 apt 命令会有坚实的支撑。

第二步:编写那个“焊工手册”(Dockerfile)

/opt/openclaw 目录下,我们要准备一个 Dockerfile。这不仅仅是几行命令,这是我们踩过无数坑之后沉淀下来的“最佳实践”。

cd /opt/openclaw  
# 将以下内容写入Dockerfile
cat > Dockerfile <<'EOF'  
FROM ghcr.io/openclaw/openclaw:latest  
  
USER root  

# 1) 系统工具 + 浏览器运行依赖 + chromium + 常用字体  
RUN apt-get update && apt-get install -y --no-install-recommends \  
    sqlite3 \  
    rclone \  
    ca-certificates \  
    chromium \  
    libnss3 libnspr4 \  
    libatk1.0-0 libatk-bridge2.0-0 \  
    libcups2 \  
    libdrm2 \  
    libxkbcommon0 \  
    libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 \  
    libgbm1 \  
    libpango-1.0-0 libcairo2 \  
    libasound2 \  
    fonts-noto-cjk fonts-noto-color-emoji \  
 && rm -rf /var/lib/apt/lists/*  
  
# 2) 固定 Playwright 版本,并把浏览器缓存写入镜像层  
ARG PLAYWRIGHT_VERSION=1.50.1  
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright  
ENV CHROME_PATH=/usr/bin/chromium  
  
WORKDIR /app  
  
# 如果 /app 没有 package.json,补一个最小的  
RUN test -f package.json || (printf '{\n  "name": "openclaw-app",\n  "private": true\n}\n' > package.json)  
  
# 3) 关键:不用 npm 安装 Playwright(会触发 npm 的奇怪报错),改用 pnpm  
# 4) 关键:/app 在这个镜像里被当成 workspace root,所以 pnpm add 需要加 -w  
RUN corepack enable \  
 && corepack prepare pnpm@9.15.3 --activate \  
 && pnpm add -Dw -w playwright@${PLAYWRIGHT_VERSION} \  
 && pnpm exec playwright install chromium \  
 && pnpm exec playwright install-deps chromium  
  
USER node  
EOF

构建镜像

在 Dockerfile 所在目录直接 build镜像:

cd /opt/openclaw  
docker build -t openclaw-patched:latest .

自测(必须做)

构建完成后,先用一个最小脚本验证这四件事:

  • 架构是否为 arm64(或你的目标架构)

  • 系统 chromium 是否存在

  • Node 能否 require("playwright")

  • Playwright 能否启动浏览器并访问网页

docker run --rm -it openclaw-patched:latest sh -lc '  
node -p "process.arch"  
which chromium || which chromium-browser || true  
node - << "NODE"  
const { chromium } = require("playwright");  
(async () => {  
  const b = await chromium.launch({ headless: true, args: ["--no-sandbox"] });  
  const p = await b.newPage();  
  await p.goto("https://example.com", { waitUntil: "domcontentloaded" });  
  console.log("title=", await p.title());  
  await b.close();  
})();  
NODE  
'

预期输出中应该包含:

  • arm64(或你的架构)

  • /usr/bin/chromium(或对应路径)

  • title= Example Domain

只要这一步通过,说明镜像层面已经完全 OK。

用新镜像运行 OpenClaw

docker-compose.yml 里把原镜像改成 openclaw-patched:latest

services:  
  openclaw:  
    build: .  
    image: openclaw-patched:latest  
    container_name: openclaw  
    restart: always  
    env_file: .env  
    volumes:  
      - ./data:/home/node/.openclaw

然后重启OpenClaw:

docker compose down  
docker compose up -d  

查看OpenClaw的日志输出

docker compose logs -f

验证:当 AI 第一次睁开眼

当你编译完新镜像并启动后,那种感觉是非常奇妙的。 你可以发一篇微信公众号给OpenClaw。

当你在对话里看到它成功输出网页标题,甚至能截图返回给你时,你会意识到,它不再是那个只能听你说话的盒子了。它现在拥有了独立获取信息、独立处理数据的完整能力。

日常我们只能让腾讯元宝阅读公众号文章,但是那个模型不怎么理想。上图左边是OpenClaw读取的微信公众号文章。它正确抓取到内容,并给出详细总结。右边是Gemini,同样的链接,它先是编了一个摘要,被戳穿后只好承认自己无法查看公众号文章。打完补丁后的这个OpenClaw从此可以帮我深度阅读微信公众号,甚至有可能可以帮我抢个春运车票!

结语:折腾的本质是“掌控”

我们为什么要花几个小时去折腾这几百兆的镜像补丁?

是因为我们不满足于做一个“工具的搬运工”。当你的 Agent 拥有了 sqlite3 的结构化记忆,拥有了 Playwright 的广阔视野,拥有了 rclone 的流动能力,它才真正开始成为你数字生命的延伸。


如果你在复现过程中遇到了新的报错,欢迎在评论区留言。