OpenClaw官方Docker容器中ClawdHub安装EACCES权限问题记录
问题背景
最近在使用 OpenClaw 官方 Docker 镜像时,我想通过 OpenClaw 控制台里的技能安装页面安装 ClawdHub,但安装过程直接失败了。表面上看像是一个普通的 npm 安装报错,实际排查下来是一个典型的容器权限问题。
这个问题对应的是 GitHub issue #6620。根据 issue 里的描述,该问题最早在 2026 年 2 月 2 日被报告,触发场景是在官方 Docker 容器中执行 npm install --global clawdhub。
问题现象
关键报错如下:
Error: EACCES: permission denied, mkdir /usr/local/lib/node_modules/clawdhub
从日志上看,失败点非常明确,npm install --global clawdhub 在尝试创建全局安装目录时没有权限,最终以退出码 -13 结束。
问题环境大致如下:
- 官方 OpenClaw Docker 镜像
- Node
v22.22.0 - npm
10.9.4 - Linux
6.8.12-17-pve - 容器内实际运行用户为
node,不是root
根因分析
根因其实并不复杂。
官方 Dockerfile 在运行阶段使用的是非 root 的 node 用户,这本身是合理的安全实践。但是 npm install --global 默认仍然会尝试把包安装到下面这些全局目录:
/usr/local/lib/node_modules
/usr/local/bin
而这些目录通常是在镜像构建阶段由 root 创建的,因此目录所有者还是 root。这样一来,运行中的 node 用户在执行全局安装时,就会因为没有写权限而触发 EACCES。
也就是说,这个问题并不是 clawdhub 独有的问题,而是容器里所有依赖 npm install -g 的安装路径都可能遇到的通用权限问题。
临时解决方案
如果只是想先把功能跑起来,目前我会把临时处理分成两种思路。
方案一:在运行中的容器里临时修正目录权限
如果容器已经启动,可以先在宿主机执行下面这条命令:
docker exec -u root openclaw-gateway chown -R node:node /usr/local/lib/node_modules /usr/local/bin
这条命令的作用是进入正在运行的 openclaw-gateway 容器,以 root 身份把 npm 全局安装常用目录的所有者改成 node 用户。这样做之后,再执行全局安装时,权限问题通常就不会再出现。
不过这个方式本质上还是运行时修补,容器重建之后是否仍然有效,要看实际部署方式。
方案二:绕过全局安装,改成本地安装
cd /home/node/.openclaw/workspace
npm install clawdhub
npx clawdhub --help
这种方式的思路很直接:
- 不再写入
/usr/local/lib/node_modules - 改为安装到当前工作目录下的
node_modules - 通过
npx直接调用本地安装的命令
对于临时验证功能来说,这个方案是够用的。
总结
这次问题本质上不是“ClawdHub 安装器坏了”,而是“官方 Docker 容器在非 root 用户下执行 npm install --global 时,遇到了全局安装目录的权限限制”。
在不改动官方 Dockerfile 的前提下,这篇记录的重点就是把现象和根因留档,并给出一个可用的临时绕过方式:避免全局安装,改为在工作目录里本地安装并通过 npx 调用。
如果后续官方镜像修复了这个权限问题,再回头更新这篇记录也会比较清楚。