错误:EACCES:在Elastic Beanstalk上运行`npm install`时权限被拒绝

Sbb*_*bbs 13 ubuntu amazon-web-services node.js amazon-elastic-beanstalk

我已经通过Elastic Beanstalk配置了一个默认的clean node.js应用程序,并且有一个node.js脚本试图npm install在项目目录(/var/app/current/deploy-dist)中运行,但是,引发了以下权限错误:

npm WARN locking Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock'
npm WARN locking     at Error (native)
npm WARN locking  /tmp/.npm/_locks/staging-f212e8d64a01707f.lock failed { Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock'
npm WARN locking     at Error (native)
npm WARN locking   errno: -13,
npm WARN locking   code: 'EACCES',
npm WARN locking   syscall: 'open',
npm WARN locking   path: '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' }
npm WARN deploy-dist No description
npm WARN deploy-dist No repository field.
npm WARN deploy-dist No license field.
npm ERR! Linux 4.4.35-33.55.amzn1.x86_64
npm ERR! argv "/opt/elasticbeanstalk/node-install/node-v6.9.1-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.9.1-linux-x64/bin/npm" "install"
npm ERR! node v6.9.1
npm ERR! npm  v3.10.8
npm ERR! path /tmp/.npm/_locks/staging-f212e8d64a01707f.lock
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall open

npm ERR! Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock'
npm ERR!     at Error (native)
npm ERR!  { Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock'
npm ERR!     at Error (native)
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'open',
npm ERR!   path: '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! Please include the following file with any support request:
npm ERR!     /var/app/current/deploy-dist/npm-debug.log
Run Code Online (Sandbox Code Playgroud)

package.json只是一个:

{
  "dependencies": {
    "node-fetch": "^1.3.3"
  }
}
Run Code Online (Sandbox Code Playgroud)

npm install使用sudo 运行显然有效,但最好避免作为解决方案.

根据文档建议设置NPM_CONFIG_PREFIX到目录也不起作用,问题仍然存在.~npm

我怀疑问题在于不正确的权限/tmp/.npm,这是

drwxr-xr-x 114 root root 4.0K Dec 27 17:04 .npm
Run Code Online (Sandbox Code Playgroud)

这是令人困惑的,因为我预计一个简单npm install的开箱即用.

更新:项目目录不应该包含node_modules文件夹,但即使删除它并运行npm install也不会修复它.

hsr*_*tha 13

我有这个问题!您可以使用ebextensions创建更改文件夹权限的部署后脚本tmp/npm/.locks.

在node.js项目中,.ebextensions如果尚未创建文件夹,请创建一个文件夹.然后,添加一个新的配置文件,例如00_create_postdeploy_script.config,使用以下yaml:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_fix_node_permissions.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      chown -R nodejs:nodejs /tmp/.npm/_locks/
Run Code Online (Sandbox Code Playgroud)

部署时,这将在/opt/elasticbeanstalk/hooks/appdeploy/post被调用中创建一个脚本,99_fix_node_permissions.sh如下所示:

#!/usr/bin/env bash
chown -R nodejs:nodejs /tmp/.npm/_locks/
Run Code Online (Sandbox Code Playgroud)

因为它位于该post文件夹中,所以它将在您的应用程序部署后自动运行 - 因此会根据需要更改权限.

编辑:如果您在整个 .npm文件夹的权限方面遇到问题,那么您应该将配置文件的最后一行更改为:

chown -R nodejs:nodejs /tmp/.npm/
Run Code Online (Sandbox Code Playgroud)

  • 稍微更正了您的答案以完全解决问题(chwon`/ tmp / .npm`而不是`/ tmp / .npm / _locks`) (2认同)