Beanstalk环境npm/yarn安装后模块缺失 仅root用户可正常执行命令
问题背景
在PHP环境的Beanstalk中配置posthook用于安装npm,实现程序化构建项目。.platform/hooks/postdeploy/99_node.sh的脚本内容如下:
curl -fsSL https://rpm.nodesource.com/setup_12.x | bash - yum install -y nodejs npm install -g yarn lerna gatsby-cli yarn global add lerna gatsby-cli yarn start
当前核心问题:执行yarn build启动Gatsby构建任务时,webapp用户执行失败,仅root用户可正常运行。
核心原因
- 全局包权限问题:posthook默认以root身份执行,全局安装的yarn、lerna、gatsby-cli等工具的执行权限、缓存目录默认仅root可访问,webapp用户无读取/执行权限
- 项目目录权限问题:root执行依赖安装、生成的缓存文件属主为root,webapp用户无项目目录读写权限
- yarn全局路径问题:yarn默认全局安装目录、缓存目录在root用户home路径下,webapp用户无法访问
解决方案
1. 修正posthook脚本逻辑
调整脚本的权限配置、执行身份,从根源避免权限冲突:
curl -fsSL https://rpm.nodesource.com/setup_12.x | bash - yum install -y nodejs # 配置npm全局包安装到公共路径,开放执行权限 npm config set prefix '/usr/local' npm install -g yarn lerna gatsby-cli # 配置yarn全局包安装到公共路径 yarn config set prefix '/usr/local' yarn global add lerna gatsby-cli # 切换到项目根目录,修正所有文件属主为webapp cd /var/app/current chown -R webapp:webapp ./ # 切换为webapp身份执行构建 runuser -u webapp -- yarn build
2. 补充全局缓存目录权限配置
如果仍有权限报错,在脚本中额外添加全局缓存目录的权限调整:
# 开放npm全局包目录读写权限给webapp用户组 chmod -R 755 /usr/local/lib/node_modules chown -R root:webapp /usr/local/lib/node_modules # 开放yarn全局缓存目录读写权限给webapp用户组 mkdir -p /usr/local/share/.cache/yarn chown -R root:webapp /usr/local/share/.cache/yarn chmod -R 775 /usr/local/share/.cache/yarn
3. 统一构建执行身份
所有涉及项目依赖安装、构建的操作,都通过runuser -u webapp切换为webapp身份执行,不要直接用root运行yarn相关命令,避免生成root属主的文件导致后续读写失败。
内容的提问来源于stack exchange,提问作者tmas
相关产品推荐
相关产品推荐

