为什么Laravel Sail执行NPM时报错Node.js版本不被支持?
问题根因
- 你通过
docker exec进入容器时默认使用root用户,你安装的Node 16.5是通过nvm存放于root用户的专属目录下,仅root用户的PATH环境变量会优先加载该版本的Node路径 - Laravel Sail执行npm相关命令时,默认使用容器内的
sail普通用户运行,该用户没有配置nvm的环境变量,会优先调用系统预装的旧版Node(对应你日志中/usr/bin/node的v10.19版本) - 日志中的PATH排序显示
/usr/bin优先级高于nvm的Node路径,即使用户有权限访问root下的nvm目录,系统也会优先找到旧版Node
解决方案
方案1:临时指定root用户执行npm命令
每次执行sail npm命令时增加root用户参数即可:./vendor/bin/sail run --user root npm run dev./vendor/bin/sail run --user root npm run watch
方案2:全局替换系统Node版本(一劳永逸)
以root用户进入容器后,将nvm安装的Node 16.5覆盖到系统全局路径:
cp /root/.nvm/versions/node/v16.5/bin/node /usr/bin/node cp /root/.nvm/versions/node/v16.5/bin/npm /usr/bin/npm cp /root/.nvm/versions/node/v16.5/bin/npx /usr/bin/npx
替换完成后,所有用户调用node、npm命令都会使用16.5版本。
方案3:为sail用户配置nvm环境
切换到sail用户后安装配置nvm,并安装Node 16.5,确保sail用户的PATH环境变量中nvm路径优先级高于/usr/bin,后续sail执行npm命令时就会自动加载正确的Node版本。
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

