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 调用。

如果后续官方镜像修复了这个权限问题,再回头更新这篇记录也会比较清楚。