Docusaurus编译问题记录
· 阅读需 4 分钟
1. 编译报错
1.1. 报错信息
sh: 1: docusaurus: Permission denied
1.2. 解决方案
chmod +x node_modules/.bin/docusaurus
如果仍然报 Permission denied,再检查两点:
- 文件系统是否被挂载成 noexec
mount | grep "$(df -P . | tail -1 | awk '{print $1}')"
看到 noexec 就重新挂载:
sudo mount -o remount,exec /mnt/disk0
- 确认你确实在 Linux 一侧 的 ext4 分区里运行,而不是在/mnt/disk0 这种 Windows 盘(DrvFs)上——WSL 的 DrvFs 默认带 noexec,而且 chmod 无效。 把项目 mv 到 ~/projects 之类的原生 Linux 目录再试即可。
把 NFS 挂成 noexec 是 管理员故意为之 的安全基线,不是技术做不到,而是 不允许做。原因有三条,每一条在安全合规场景里都是“硬杠杠”:
- 阻断远程可执行文件直接在服务器上跑
NFS 里放的文件可能是任何客户端上传的,一旦允许执行,别人只需
echo -e '#!/bin/sh\nevil' > /nfs/evil.sh; ./evil.sh就能在服务器上拿到与挂载用户同权限的 shell。 挂成noexec后,即使文件有 0777 权限,内核也直接返回EPERM, 把攻击面一刀砍掉。 - set-uid/set-gid 无法被客户端信任
可执行文件常常带
setuid位来提升权限。NFS 的 uid/gid 只是 “客户端声称的数字”,服务器无法验证。 如果允许执行,客户端可以伪造root suid二进制,服务器一跑就提权。noexec让这类文件直接废掉,根本进不了内核的execve路径。 - 合规/审计要求
很多规范(SOX、ISO27001、等保 2.0)明确要求“网络文件系统不得用于存放或执行可执行代码”。
挂
noexec是最简单、最可验证、不依赖用户自觉的技术手段, 审计员一条mount | grep noexec就能给通过。
2.1. 报错信息
Possible solutions:
- Install with verbose logging and look for errors: "npm install --ignore-scripts=false --foreground-scripts --verbose sharp"
- Install for the current linux-x64 runtime: "npm install --platform=linux --arch=x64 sharp"
2.2. 解决方案
sharp 的 原生模块 (sharp-linux-x64.node) 在 npm install 时 没有编译/下载成功,所以 build 阶段一引用就崩。
常见根因就三类:
- 平台不匹配 – 你在
noexec的 NFS 上装包,post-install 脚本被禁用,sharp 没机会编译/下载预编译文件。 - 缺系统依赖 –
libvips或g++没装,导致编译失败。 - CPU/架构 – 在 x64 机器上却装成了 arm64 版本(或反之)。
按顺序一次性解决:
- 先把 sharp 清干净(避免残留脏文件)
rm -rf node_modules/@docusaurus/responsive-loader/node_modules/sharp
- 装系统工具链(只缺时再装)
# Debian/Ubuntu
sudo apt update
sudo apt install -y build-essential libc6-dev libvips-dev
- 重新安装 sharp 并允许脚本运行
npm install --ignore-scripts=false --foreground-scripts --verbose sharp
如果你 仍在 NFS 目录 且挂载了
noexec,--ignore-scripts=false也会失败——post-install 脚本无法执行。 要么
- 把项目整个
cp到本地 ext4 盘再执行, 要么- 临时挂成
exec装完再挂回noexec(运维允许的前提下)。
- 确认 sharp 已拿到正确二进制
ls -l node_modules/sharp/build/Release/sharp-linux-x64.node
文件存在且大小 > 1 MB 即成功。
- 重新 build
npm run build
一次性指令(本地磁盘场景)
# 1. 清缓存
npm cache clean --force
rm -rf node_modules package-lock.json
# 2. 全量重装(带脚本)
npm install --ignore-scripts=false
# 3. build
npm run build
做完以上,sharp 模块就能正常加载,Docusaurus 即可顺利完成生产构建。