
在Windows上把OpenClaw用Docker跑起来再连到飞书机器人这套流程我前后折腾了整整一个周末。最初我天真地以为装个Docker Desktop、拉个镜像、填几个token就完事了结果卡在WSL2、卡在事件订阅、卡在容器日志里那串英文报错……回头总结大部分时间都花在“顺序错误”上——环境没就绪就开始配飞书或者应用没发布就去测试一步错步步错。这篇文章就是把我踩过的坑、验证过有效步骤一次性写清楚给想在Windows上跑OpenClaw并接飞书的人一个“可照抄的路线图”。先说清楚这套东西能干什么。OpenClaw是一个开源的AI代理框架它把大模型能力和工具调用打包成一个可以独立运行的服务你可以把它理解成一个“数字员工”。让它接入飞书之后你就能在飞书单聊或群里直接和它对话让它写代码、整理资料、查天气、调用各种外部工具甚至让它定时给你推日报。对团队来说这相当于在办公IM里养了一个随叫随到的AI助手。这套方案适合谁想在公司飞书里部署一个能干活的工作流机器人、又不想把代码和依赖搞得全盘都是的开发者以及想在本地Windows机器上研究AI代理框架、但只有一台Windows电脑的技术爱好者。读完之后你会知道每一步为什么要这么做而不是只会照着抄命令。1. 方案选型为什么是Docker OpenClaw 飞书1.1 这套链路到底在做什么OpenClaw是什么飞书凭什么值得连OpenClaw本质上是一个“代理运行时”。你把大模型的API密钥给它再给它配置好可用的工具比如代码执行、网页访问、文件读写它就能自己拆解任务、一步步执行。它不像ChatGPT网页版那样只停留在对话框里而是真的去帮你操作一些东西然后把结果返回给你。飞书在这里扮演的是“交互界面”。企业办公场景里大家习惯用飞书沟通但如果把这个AI代理接到飞书里你就不用打开另一个网页或终端直接在聊天窗口里就能指挥它。飞书机器人能收单聊、能进群聊还能通过卡片消息发送结构化内容这个体验比传统的命令行交互友好太多了。我之前试过别的方案最终留下这套就是因为飞书在办公场景的覆盖度和API成熟度都够。1.2 为什么用Docker而不是直接在Windows裸跑很多人第一反应是“直接下载Node.js或Python跑不就行了吗”这是个典型的思维陷阱。OpenClaw依赖一堆底层库和运行时环境在Windows上裸跑光是把依赖装齐、版本对齐就能耗掉你半天。而且Windows的路径分隔符、环境变量策略和Linux很不一样很多配置文件的写法在Linux下没问题到了Windows就各种报错。Docker把这些全包了。镜像里已经包含了OpenClaw需要的完整Linux运行环境你只需要拉镜像、配环境变量、映射数据卷就能得到一个随时可复现的部署。我做一个对比你就明白了对比项Windows裸跑Docker容器环境隔离依赖全部装在宿主机容易冲突运行环境封装在镜像内宿主机干净版本切换升级要动全局依赖回滚麻烦拉不同tag就能切换版本秒级回滚数据迁移配置散落在多个目录数据和配置集中在卷目录拷走即迁移资源占用取决于进程本身底层WSL2有一定内存开销但可控还有一个很现实的好处Docker容器用restart: unless-stopped策略后机器重启容器会自动拉起来OpenClaw和飞书的长连接会跟着恢复省去手动启动的烦恼。这在Windows下体验尤其重要因为Windows更新后经常静默重启。1.3 WSL2后端和Hyper-V后端怎么选Windows上的Docker Desktop后端有两种WSL2和Hyper-V。官方现在默认推荐WSL2因为启动速度更快、内存占用更动态。WSL2本质上是一个轻量虚拟机但它和Windows的文件系统、网络互通性做得很好Docker容器里的服务可以直接通过localhost从Windows访问这点对配置OpenClaw来说太方便了。Hyper-V后端是以前的技术路线它的网络模型更接近传统虚拟机但启动慢、资源占用固定、配置也更绕。除非你用的Windows版本太老不支持WSL2否则我建议直接选WSL2后端。在Docker Desktop安装界面勾选“使用WSL2而不是Hyper-V”后续在Settings的General里也能看到当前后端类型。需要注意WSL2后端要求Windows 10 2004及以上或Windows 11并且BIOS里要开启虚拟化。企业批量管理的机器可能被组策略禁用了虚拟化功能安装前先自查一下具体检查方法我放到下一章。1.4 飞书接入的两条路为什么要走长连接OpenClaw以及旗下很多类似代理框架接入飞书时飞书开放平台提供两种事件接收方式。第一种是“请求地址”模式也就是webhook回调。飞书服务器会把用户发给机器人的消息POST到你配置的一个公网HTTPS地址上。这个模式要求你的服务必须有一个公网可达的地址本地Windows机器没有固定公网IP的话就得折腾内网穿透极其痛苦。第二种是“长连接”模式也叫Stream模式。应用主动和飞书服务器建立一个长连接飞书有新事件时直接通过这个连接推给你你的服务不需要公网入口。这个模式对本地部署简直友好到爆炸Docker容器放着不动连接自动维持断开会自动重连。OpenClaw的飞书适配器走的正是长连接模式这也是我为什么敢直接在Windows本地用Docker部署的原因。你只需要提供App ID和App Secret它自己会去建立连接不需要你管什么回调域名和HTTPS证书。2. 环境准备Windows Docker Desktop的地基2.1 动手前先自查CPU虚拟化、系统版本、WSL内核别急着下载安装包先花两分钟做四个检查能省下后面大量排查时间。第一打开任务管理器切到“性能”标签页看右下角“虚拟化”是否显示“已启用”。如果显示“已禁用”需要进BIOS开启Intel VT-x或AMD SVM这一步不做WSL2连装都装不上。第二确认Windows版本。WinR运行winver如果系统版本低于Windows 10 2004建议先把系统更新到最新因为WSL2依赖比较新的内核组件。第三在PowerShell里运行wsl --status看看默认版本是不是2。如果显示没有WSL发行版或内核版本太旧运行wsl --update更新内核。第四确认两个Windows功能已经打开“适用于Linux的Windows子系统”和“虚拟机平台”。打开方式控制面板 - 程序 - 启用或关闭Windows功能把这两个勾上然后重启系统。我身边至少有两个人卡在这一步——看着都勾了但没重启Docker Desktop就一直报“WSL 2 installation is incomplete”。2.2 Docker Desktop安装与WSL2集成完成上面的检查后去Docker官网下载Docker Desktop Installer.exe。安装过程中有一个关键勾选框问你要不要用WSL2替代Hyper-V务必勾选。安装完成后它会提示你退出并重启别偷懒跳过这一步Docker Desktop首次启动需要加载WSL2内核。重启之后打开Docker Desktop进入Settings - Resources - WSL Integration会看到一个列表列出你本机的WSL发行版。如果你只是想给Docker用保持默认就行它会用一个名为docker-desktop的专用WSL发行版运行容器。如果你还装了Ubuntu之类的发行版可以顺手打开集成开关这样在WSL终端里也能直接调用docker命令。验证是否成功打开PowerShell运行以下命令docker version docker info看到Client和Server两段信息都正常输出Server的Operating System显示类似Docker Desktop - WSL2的内容说明Docker已经就绪。如果只有Client段、没有Server段那就是Docker引擎没启动回到设置里看后端选的是不是WSL2。2.3 用.wslconfig给WSL2“限个流”这里必须说一个Windows用户的经典痛点C盘空间和内存莫名被吃。WSL2的虚拟磁盘文件ext4.vhdx只会膨胀、不会自动收缩。你拉几个大镜像、容器里写点日志这个文件就能轻松冲破30GB。内存方面WSL2默认最多占用宿主机约50%的内存OpenClaw本身用不到这么多白白浪费。我建议在用户目录下建一个.wslconfig文件路径是C:\Users\你的用户名\.wslconfig内容如下[wsl2] memory4GB processors2 swap2GB localhostForwardingtrue保存后在PowerShell里运行wsl --shutdown然后重新打开Docker Desktop配置就会生效。memory限制在4GB对OpenClaw来说绰绰有余毕竟它主要消耗的是大模型API调用容器本地占用的内存很小。processors限制为2核是为了防止编译类工具或多个容器同时跑的时候把CPU吃满。.wslconfig里还能配networkingModemirrored这个模式可以让WSL2和Windows共享网络接口解决某些端口访问不到的问题。不过Docker Desktop默认的localhostForwarding已经足够让Windows访问容器端口我实际测试下来不用额外开mirrored模式。2.4 启动失败怎么办按顺序排查四个点Docker Desktop装完后一键能起是运气好不能正常启动才是常态。我遇到过四次每次原因都不一样。按照下面顺序排查基本能快速定位。第一Docker Desktop一直卡在Starting界面。90%的情况是WSL2没准备好。运行wsl --status看状态如果是Default Version: 2但没有任何发行版就先装一个发行版再回来或者运行wsl --update。第二报错信息里有vmcompute。打开服务管理器services.msc找到Hyper-V Host Compute Service确认它没有处于禁用状态右键启动并把启动类型设为“自动”。这个服务是WSL2网络和虚拟机管理的核心很多Windows精简版或安全软件会把它干掉。第三BIOS虚拟化未开启。前面说的任务管理器检查如果显示“已禁用”进BIOS找Intel Virtualization Technology或SVM Mode开启后重启。第四老驱动或旧版本Docker残留。如果你曾经装过Docker Toolbox或很老的Docker Desktop先彻底卸载删除C:\ProgramData\Docker和C:\Users\你的用户名\AppData\Local\Docker残留目录再重装。3. OpenClaw的Docker化部署3.1 拉镜像之前把镜像源和标签定下来Docker就绪后下一步是拉OpenClaw镜像。这一步最大的坑是镜像源。直接从Docker Hub拉国内网络经常慢到怀疑人生。我推荐先在Docker Desktop的Settings - Docker Engine里配置镜像加速器把自己惯用的registry mirror地址加到registry-mirrors数组里保存后Docker会自动重启。拉镜像会快很多。镜像标签也别糊涂。用latest标签虽然省事但OpenClaw这种迭代快的项目latest经常引入breaking change。我建议去项目仓库的Releases页面看一眼当前稳定版本号拉固定tag比如docker pull openclaw/openclaw:0.5.0注意如果你拉镜像时报了no matching manifest for windows/amd64说明这个镜像的架构和Windows不匹配。检查一下Docker Desktop右下角是不是运行在Linux容器模式默认就是不要误切成Windows容器模式那会导致很多镜像都拉不下来。3.2 docker-compose.yml怎么写才不容易翻车OpenClaw容器要跑得稳我建议别用docker run裸跑而是把配置固化到docker-compose.yml里。这样改配置、重启、迁移都方便。我的compose文件是这样的services: openclaw: image: openclaw/openclaw:0.5.0 container_name: openclaw restart: unless-stopped ports: - 8080:8080 env_file: - .env volumes: - ./openclaw_data:/app/data - ./openclaw_config:/app/config extra_hosts: - host.docker.internal:host-gateway几个参数我解释一下。restart: unless-stopped保证Windows重启后容器自动拉起不用你手动操作。ports的8080是OpenClaw带的管理接口端口后面排障看面板会用上。env_file引用同目录下的.env文件API密钥和飞书凭证都放那里避免敏感信息写死在compose里。volumes把容器内的数据和配置目录映射到宿主机容器删了数据还在。extra_hosts这行是我踩坑后加上的。如果OpenClaw需要访问Windows宿主机的某个服务比如本地跑了一个API接口它可以通过host.docker.internal这个域名指向宿主机。WSL2后端下通常自动映射但显式声明一次最保险。3.3 核心配置模型API与飞书渠道参数OpenClaw需要一个模型后端才能干活。它兼容OpenAI格式的API所以无论是OpenAI、Claude还是国内厂商提供的OpenAI兼容网关、或者你自己部署的本地模型都能接入。我这里以OpenAI兼容接口为例给出.env文件的最小集# 大模型配置 OPENCLAW_MODEL_PROVIDERopenai OPENCLAW_MODELgpt-4o-mini OPENCLAW_API_KEY你的_key OPENCLAW_API_BASEhttps://api.example.com/v1 # 飞书渠道配置 OPENCLAW_FEISHU_APP_IDcli_xxxxxxxx OPENCLAW_FEISHU_APP_SECRET你的_secret环境变量名具体叫什么以你拉的OpenClaw镜像版本文档为准但配置思路都是一样先配模型再配渠道。我习惯把模型provider设为openaimodel选一个快、便宜的型号因为飞书里的日常对话用不上最强模型省钱还快。如果你团队里已经跑着本地大模型比如Ollama部署的模型OpenClaw也可以通过OpenAI兼容端点接过去本地模型的好处是数据不出内网但响应速度和推理质量会有取舍。OpenClaw还支持把Codex这类编程代理作为后端接入。本质上Codex也提供OpenAI兼容接口配置方法和上面一样换一下API_BASE和模型名就行。我建议先跑通一个简单的模型后面再慢慢换。3.4 首次启动与验证看日志确认在跑配置文件就位后在同目录下运行docker compose up -d docker compose logs -f openclaw第一次启动会拉镜像、初始化容器日志里如果出现类似Feishu adapter connected或Lark stream connected的关键字说明飞书长连接已经建立成功这一半的活儿就算干完了。如果日志里报fetch failed或connection refused多半是模型API地址填错了或者网络不通先验证这两点再看别的。容器状态可以用docker ps查看看到Up且不是不断重启就说明进程还算健康。我习惯顺手验证一下管理端口浏览器打开http://localhost:8080能看到OpenClaw的管理界面说明容器内部HTTP服务正常。再补一个细节修改.env之后光docker compose restart有时不会重新读取环境变量我之前就吃过亏。正确的做法是重新创建容器docker compose up -d --force-recreate跑这个命令容器会重建但数据卷还在配置也会重新加载非常稳。4. 飞书自建应用与机器人配置4.1 在飞书开放平台创建自建应用打开飞书开放平台登录后用管理员账号创建应用。在“开发者后台”里点“创建企业自建应用”填应用名称和描述上传一个图标。这里有一点要注意企业自建应用只能由管理员创建和通过审核如果你是普通成员需要找个管理员配合这部分卡住的话后面全白搭。创建完成后你会进入应用详情页。左侧菜单里有一个“应用能力”分类点“添加应用能力”把“机器人”能力加上。这一步没做的话这个应用根本没有机器人的身份就算后面把App ID填进去也无法在飞书里发起对话。4.2 开通机器人能力与最小权限集权限是飞书接入里最烦人的环节。一开始我图省事列了一堆权限结果审核被驳回一次后来学乖了只开通最小必要权限。基础接入需要这三个权限权限点作用必要性im:message读取用户发给机器人的消息内容必选im:message:send_as_bot以机器人身份发送消息必选im:chat获取群组信息机器人加群时需要建议开启开通位置在“权限管理”页面搜索对应的权限点点击开通。开通后你会看到一个“等待发布”的状态——这里就是网上教程一带而过、但坑了无数人的地方权限开通后必须创建应用版本并发布新权限才会生效。不发布的话你填好App ID和Secret机器人能连接但收不到任何消息因为它实际上没被授予任何能力。4.3 事件订阅走长连接添加消息接收事件进入“事件订阅”页面最上面有一个选择使用“请求地址”还是“使用长连接”。注意这一步要选“使用长连接”原因我在第一章说过——本地部署没有公网回调地址长连接模式是唯一不用穿透的方案。选完长连接后页面下方会出现一个“添加事件”的区域搜索im.message.receive_v1接收消息事件把它添加上。保存事件订阅配置后你会看到应用生成了一个加密策略和secret。这个secret是用来校验事件内容的OpenClaw默认会自己管理通常不需要你手动填但不同版本可能要求不同留意日志提示即可。长连接模式下应用启动后会和飞书服务器建立WebSocket连接容器日志会成为你判断连没连上的第一依据。4.4 拿到App ID与App Secret填进OpenClaw在“凭证与基础信息”页面你能看到App ID和App Secret。App ID是公开的App Secret只在首次创建时完整展示一次之后的列表里会遮住不给你一键复制。所以拿到后第一时间存好别关了页面再回来找那就得重置了。把这两个值填到之前那个.env文件里对应OPENCLAW_FEISHU_APP_ID和OPENCLAW_FEISHU_APP_SECRET。注意cli_前缀要保留我见过有人把前缀去掉只填后半段结果连接一直失败排查半天才发现复制的时候少复制了前缀。填完执行一次docker compose up -d --force-recreate让容器重新读取配置。4.5 发布版本、添加机器人并完成首测配置到这一步还差最后一步发布应用。进入“版本管理与发布”创建新版本填写版本号比如0.1.1、更新说明提交发布。管理员的账号会直接通过非管理员需要管理员审核。版本成功发布后应用状态会变成“已发布”这时候权限和机器人能力才算真正生效。回到飞书客户端搜索应用名称找到这个机器人点“添加”。它会出现在你的单聊列表里。发一条“你好”试试如果机器人正常回复恭喜你链路全通了。我建议首测别急着上复杂技能先发基础消息再测试提问、查资料、执行简单命令。如果想让机器人主动给群聊推送内容比如发日报表格OpenClaw可以调用工具生成文件然后通过飞书消息接口把文件发出去这就是进阶玩法了等基础链路稳定后再研究。5. 常见问题排查与避坑实录5.1 Docker与容器层面的故障排查容器层面的问题我分成三类说。第一类是容器不断重启。用docker compose ps看状态如果显示Restarting那就docker compose logs openclaw看最后几十行日志。最常见的原因是环境变量没配对——模型API key多了个空格、飞书Secret抄错字符这类问题日志里通常直接打印401或403错误。第二类是拉镜像特别慢或超时。这个是网络问题配置registry mirrors之后会改善很多。还有一种情况是镜像很大等几分钟很正常别急着觉得卡死了只要日志还在输出layer下载进度就行。第三类是端口占用。如果你本机8080口被别的程序占了容器会起不来。改compose里左边的宿主机端口比如改成18080:8080管理面板访问http://localhost:18080。容器内的8080不用动。5.2 OpenClaw容器起来了但飞书没反应这可能是整套部署中最常见的“看起来正常实际不干活”的情况。容器状态是Up日志也不报错但飞书里发消息就是石沉大海。按这个顺序排查先确认日志里有没有Feishu adapter connected或类似字样。没有的话说明长连接没建立检查App ID和Secret是不是弄反了这两个值填错位置是极其容易发生的事我就犯过。连接已建立但不回消息去飞书开放平台确认应用是否已发布。很多人权限开了、事件加了但忘记了提交发布结果开发者后台看起来一切正常实际线上应用还是老版本。发一条测试消息到已版本的机器人如果日志里收到了消息事件但没回复那就是模型API出问题检查API key余额、模型名是否存在。我把排查关键词整理成速查表方便你直接对照症状优先排查方向常见解法日志无飞书连接信息App ID / Secret重新复制凭证确认前缀有连接但收不到消息应用发布状态创建版本并发布收到消息但不回复模型API配置检查API key、模型名、余额回复内容报错模型服务状态看API返回的error信息5.3 飞书侧的报错与权限问题飞书侧的报错隐蔽性很强。权限没开够表现往往不是报错而是某些类型消息无法接收或回复失败。比如你不开im:chat权限机器人进群之后可能无法读取群ID导致群里它没反应但单聊却是好的。这种“部分功能失灵”的场景优先怀疑权限。另一个常见坑是应用被安全软件或管理员策略限制。飞书开放平台企业后台可能设置了“仅允许白名单IP调用”如果你的本地出口IP不在白名单里应用连接会时不时断开或拒绝。在“安全设置”里把这个限制关掉或者把部署机器的出口IP加进白名单。还有一个问题长连接偶尔断开。长连接模式本身有自动重连机制但Windows休眠后网络中断会导致重连不及时。我的做法是给容器配置了restart: unless-stopped同时飞书侧的连接断开后OpenClaw会自动重试实际测试下来只要容器活着长连接最终都能恢复不需要人为干预。5.4 Windows与网络环境下的隐形坑Windows环境有些坑Linux/Mac用户根本遇不到但你必须提前知道。WSL2的时间同步问题。Windows睡眠后再唤醒WSL2的时钟可能漂移这会导致请求签名校验失败飞书连接突然报错。重启WSL2能解决但更省事的办法是开启Windows的“自动设置时间”并启用“与Internet时间服务器同步”。大多数情况下这个坑不会频繁出现但熬夜调试时撞上真的会让人崩溃。防火墙拦截。WSL2的出站连接默认放行但如果你手动配过Windows防火墙可能会拦截WSL2进程。症状是容器内一切正常但请求外部API超时。临时验证方法是把防火墙切到“域配置文件”和“专用配置文件”都允许WSL应用或者临时关掉防火墙看是否恢复确认后在防火墙规则里放行对应程序。还有C盘磁盘空间。Docker镜像、容器日志、WSL2虚拟磁盘都在C盘OpenClaw跑久了日志文件会越长越大。定期执行docker system prune清理悬空镜像容器日志如果太大会占满磁盘。我现在每个月会清理一次虚拟磁盘文件偶尔用WSL2的wsl --shutdown后手动compact这个操作可以找回几十个GB的空间。5.5 几个值得记住的实战心得最后分享几条只有亲手跑过才会懂的经验。按顺序操作别跳步。我整套流程复盘下来最容易翻车的不是配置本身而是“环境没就绪就配飞书”。WSL2没装好就去拉镜像Docker没起来就去填飞书权限最后问题交织在一起排查成本翻倍。建议严格按照环境 - Docker - OpenClaw - 飞书 - 测试的顺序走。日志是你最靠谱的帮手。排查任何问题第一反应不是改配置、删容器而是看日志。OpenClaw启动时的日志会把连接状态、模型调用、飞书事件都打出来。养成docker compose logs -f看日志的习惯能省下大量瞎猜的时间。配置改了就重建容器。OpenClaw的配置读取发生在容器启动阶段不是运行中热加载。改完.env或compose文件后执行docker compose up -d --force-recreate只restart不一定管用。我调试飞书那一晚就因为图省事反复restart浪费了近一个小时。先小步验证再上复杂功能。第一次跑通时我只发了“你好”测试基础回复然后再配置工具技能。就像接通电话要先“喂喂”确认能听见再开始长篇大论一样基础链路通了后面怎么扩展都顺。这套部署方案在Windows上跑了两个多月平时基本无人值守稳定得让我已经想不起它还在后台运行。OpenClaw接入飞书之后最大的感受不是“AI好厉害”而是以前各种需要人工转达、手动整理的信息流现在直接在聊天会话里闭环了。如果这篇帮你省下了一个周末的时间那目的就达到了。