MeteorUp部署的Meteor生产环境执行挂载卷内React build脚本报错如何解决?
问题描述
基于Meteor开发了一套CMS系统,内容数据存储在MongoDB集合中,核心需求是调用关联的React项目构建静态站点后,推送到AWS S3桶完成托管部署。
使用MeteorUp将Meteor应用部署在AWS EC2实例上,参考MeteorUp官方文档在mup.js中配置了Docker卷:
module.exports = { ... meteor: { ... volumes: { '/opt/front': '/front' }, ... }, ... };
部署完成后,/opt/myproject/config/start.sh启动脚本已正确写入卷挂载参数-v /opt/front:/front,EC2实例的/opt/front目录存放React项目源码,包含package.json,node_modules已安装全量依赖,其中package.json的scripts字段配置了"build": "react-scripts build"。
React项目的数据源为/opt/front/src/assets/datas/publish.json,该文件可手动编写供独立开发使用,也可由Meteor应用动态生成。
Meteor应用的发布流程为:
- 收集CMS全量有效数据存入Publish集合
- 读取Publish集合最新一条数据,序列化为JSON字符串后写入
/front/src/assets/datas/publish.json,该步骤在生产环境运行正常,对应路径可正确生成文件 - 切换到React项目目录执行
npm run build构建静态站点,构建成功后将build目录内容上传到AWS S3桶
本地开发环境下全流程运行正常,但生产环境(Docker容器内的Meteor生产模式)执行build命令时抛出如下错误:
Error running ls: Command failed: (cd /front && npm run build) (node:39) ExperimentalWarning: The WHATWG Encoding Standard implementation is an experimental API. It should not yet be used in production applications. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! front@0.1.0 build: `react-scripts build` npm ERR! Exit status 1 npm ERR! Failed at the front@0.1.0 build script. npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2021-09-16T13_55_24_043Z-debug.log [exec-fail]
核心疑问
- 生产环境下Meteor是否支持访问挂载卷内的其他目录并执行对应package.json中的脚本?
- 该错误的产生原因是什么,如何解决?
解决方案
首先明确:生产环境下的Meteor完全支持访问Docker挂载卷内的目录,并执行对应package.json中定义的脚本,本次报错和Meteor本身的能力无关,是环境配置问题导致的。
错误原因
经SSH登录EC2实例排查,错误由两个问题共同导致:
/opt/front目录权限未设置为777,缺少写入执行权限,容器内进程操作目录文件时被拦截- Docker容器使用Node v8版本,EC2实例上的Node版本为v16,提前在实例上安装的
node-sass依赖存在版本兼容性问题,无法在容器内的Node环境下正常运行
修复步骤
- 在EC2实例上安装NVM,切换Node版本到和容器内一致的v8版本
- 删除React项目目录下的
node_modules文件夹和package-lock.json文件 - 重新执行
npm install安装全量依赖 - 调整
/opt/front目录权限为777,确保容器内进程拥有目录的读写执行权限
操作完成后问题即可完全解决,Meteor CMS可正常触发静态站点构建并发布到S3桶。
内容的提问来源于stack exchange,提问作者LoneWolfLow
相关产品推荐
相关产品推荐

