AWS Lambda执行npm命令报EROFS只读文件系统错误该如何解决?
问题根因
你已经切换到了可写的/tmp目录执行命令,但npm默认会尝试在当前用户的家目录(报错中的/home/sbx_user1051)读写缓存、全局配置相关文件,而AWS Lambda除/tmp外的所有目录均为只读,因此触发了EROFS错误。
可行解决方案
修改npm默认路径到/tmp目录
直接在执行命令中指定npm的缓存、前缀路径到可写的/tmp下即可,修改后的代码如下:exec('cd /tmp/ && NPM_CONFIG_CACHE=/tmp/.npm NPM_CONFIG_PREFIX=/tmp/.npm-global npm ci && ng build --prod="true"', (error, stderr, stdout) => { if (error) { console.log(error); return reject(error); } });也可以提前通过npm config命令配置:
cd /tmp/ && npm config set cache /tmp/.npm --global && npm config set prefix /tmp/.npm-global && npm ci && ng build --prod="true"调整Angular构建的相关路径
如果ng构建过程中也出现目录读写错误,可以额外指定Angular的缓存、输出路径到/tmp:ng build --prod="true" --cache-path /tmp/.angular-cache --output-path /tmp/dist调整Lambda临时存储配置
AWS Lambda默认的/tmp目录容量为512MB,如果你的项目依赖较多、构建产物较大,可以在Lambda配置中将临时存储(Ephemeral Storage)上限调整到最高10GB,避免磁盘空间不足报错。确认运行时依赖完整性
要确保你使用的Lambda运行时中已经包含node、npm、ng等可执行命令,如果没有预装,可以把对应依赖打包到Lambda部署包中,或者在执行命令前将node_modules/.bin加入环境变量PATH:export PATH=/tmp/node_modules/.bin:$PATH
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

