当在弹性Beanstalk上运行`npm install`时出现错误:EACCES:权限被拒绝。

15

我已经通过弹性 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文档建议,将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论坛上似乎也遇到了完全相同的问题:https://forums.aws.amazon.com/thread.jspa?messageID=758699&tstart=0 - Sbbs
你是如何在这个 Elastic Beanstalk 实例中使用 sudo 运行 "npm install" 的?虽然这不是正确的方法,但我可以通过这个临时解决方案来测试我的应用程序。 - sergi
@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 - Sbbs
请问您是在使用GitHub还是BitBucket? - Dinu Nicolae
@DinuNicolae 不是直接上传部署。 - Sbbs
3个回答

15

我曾经也遇到过这个问题!你可以使用 ebextensions 来创建一个 发布后脚本,以更改 tmp/npm/.locks 文件夹的权限。

在你的 Node.js 项目中,如果还没有 .ebextensions 文件夹,请创建一个。然后,添加一个新的配置文件,例如 00_create_postdeploy_script.config,其内容如下:

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 文件夹中,所以在您的应用程序部署后它将自动运行,并相应地更改权限。

编辑:如果您对整个.npm文件夹的权限有困惑,则应将配置文件的最后一行更改为:

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

2
我稍微修改了你的答案,以完全解决这个问题(将目录更改为/tmp/.npm而不仅仅是/tmp/.npm/_locks)。 - Sbbs
我不确定这里的建议编辑是如何工作的,但我已经更新了答案! - hsriskantha
我注意到了一件非常奇怪的事情。我只在BitBucket上遇到了这个问题,而在GitHub上权限是正常的。 - Dinu Nicolae

0

我以前也遇到过这个问题,而且在我的情况下清除缓存解决了我的问题。请尝试一下这个方法。

npm cache clean

希望能有所帮助。


1
很遗憾,没有修复它。 - Sbbs

0
以下命令将解决此问题。它对我有用。
sudo chown -R 1000:1000 "/home/user/.npm" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接