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

Posted

技术标签:

【中文标题】错误:EACCES:在 Elastic Beanstalk 上运行“npm install”时权限被拒绝【英文标题】:Error: EACCES: permission denied when running `npm install` on Elastic Beanstalk 【发布时间】:2017-05-12 01:56:42 【问题描述】:

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

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

package.json 只是一个:


  "dependencies": 
    "node-fetch": "^1.3.3"
  

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

按照npm docs suggestion 将NPM_CONFIG_PREFIX 设置为~ 的目录也不起作用,问题仍然存在。

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

drwxr-xr-x 114 root root 4.0K Dec 27 17:04 .npm

这令人困惑,因为我希望一个简单的npm install 可以开箱即用。

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

【问题讨论】:

有人现在在 AWS 论坛上似乎也遇到了完全相同的问题:forums.aws.amazon.com/thread.jspa?messageID=758699&tstart=0 您是如何在此 Elastic Beanstalk 实例中使用 sudo 运行“npm install”的?这不是方法,但我可以用这个临时解决方法测试我的应用程序。 @sergi sudo /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 你能告诉我,你用的是github还是bitBucket? @DinuNicolae 也不是,直接上传部署。 【参考方案1】:

我遇到了这个问题!您可以使用ebextensions 创建一个post-deploy script 来更改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/

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

#!/usr/bin/env bash
chown -R nodejs:nodejs /tmp/.npm/_locks/

因为它位于post 文件夹中,所以它会在您的应用部署后自动运行——因此可以根据需要更改权限。

编辑:如果您对whole .npm 文件夹的权限有问题,那么您应该将配置文件的最后一行更改为:

chown -R nodejs:nodejs /tmp/.npm/

【讨论】:

稍微更正了您的答案以完全解决问题(chwon /tmp/.npm 而不仅仅是 /tmp/.npm/_locks 我不确定建议的编辑在这里是如何工作的,但我已经更新了答案! 我注意到一件很奇怪的事情。我只有bit bucket才有这个问题,github权限很好。【参考方案2】:

我过去遇到过这个问题,在我的情况下,清理缓存解决了我的问题。 请试试这个

npm cache clean

希望对你有帮助。

【讨论】:

很遗憾没有修复它。【参考方案3】:

以下命令将解决此问题。它对我有用。

sudo chown -R 1000:1000 "/home/user/.npm" 

【讨论】:

以上是关于错误:EACCES:在 Elastic Beanstalk 上运行“npm install”时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Elastic BeanStalk 节点 Js/Angular 部署问题

Elastic Beanstalk 上的 NightmareJS 和 Electron - 权限被拒绝

Spring AWS:在 Elastic Beanstalk 上部署战争时访问被拒绝错误

错误:EACCES:权限被拒绝

在 mac 上使用 Bower 安装 Bootstrap 说:错误:EACCES,权限被拒绝

更新 firebase-admin 后出现 EACCES 错误