【问题标题】:Amazon Elastic Beanstalk node and npm non-standard install locationsAmazon Elastic Beanstalk 节点和 npm 非标准安装位置
【发布时间】:2013-08-15 08:59:24
【问题描述】:

Amazon Beanstalk 将 node 和 npm 安装到非常不起眼的地方 - 如果 EB 决定使用更新版本的 node,我不确定它们是否会改变,这会导致我的应用程序崩溃。

这些是 node 和 npm 的位置:

/opt/elasticbeanstalk/node-install/node-v0.8.24-linux-x64/bin/node
/opt/elasticbeanstalk/node-install/node-v0.8.24-linux-x64/bin/npm

我担心0.8.24 部分发生变化,我宁愿在尝试查找通常只是/usr/bin/XXX 的内容时不使用 grep 查找 cron 或 monit 脚本中的内容。

如何为这些可执行文件获得一致的文件路径? EB 为什么要这样做?

作为参考,我尝试在.ebextensions/app.config 中设置NodeVersion 选项,它对安装位置没有影响。

【问题讨论】:

  • 我假设这些位置不在 PATH 中?
  • 是的,没错,他们不是

标签: node.js amazon-web-services npm amazon-elastic-beanstalk


【解决方案1】:

Amazon Elastic Beanstalk

授予对节点命令的访问权限

  1. 须藤苏
  2. vipw
  3. nodejs:x:496:494::/tmp:/bin/bash(“:wq”保存更改)
  4. sudo su nodejs
  5. PATH=$PATH:ls -td /opt/elasticbeanstalk/node-install/node-* | head -1/bin
  6. node -v (享受:)

【讨论】:

  • 堆栈溢出不会呈现必需的反勾号,(请参阅 Peter Johnsons 的回答)
【解决方案2】:

我们遇到了类似的“找不到节点”问题,试图在容器命令中运行节点。在 EC2 实例上运行 ps aux 后,我们看到 EB 可以访问 $NODE_HOME 环境变量:

su -s /bin/sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1 nodejs

这可以在.ebextensions中使用,例如:

container_commands:
  your_node_script:
    command: 'env PATH="$PATH:$NODE_HOME/bin" ./bin/your_node_script'

(感谢艾伦·格罗)

【讨论】:

  • 这似乎比公认的答案更可靠,因为它使用节点版本设置,而不是仅仅选择最近安装的版本(或任何任意排序顺序)
  • command: 'env PATH="$PATH:$NODE_HOME/bin" sh -c 'npm run build' 工作正常。谢谢
  • 这看起来不适合我,因为 NODE_HOME 似乎没有设置:(
【解决方案3】:

根据 Peter Johnson 和 Greg Tatum 的回复,我创建了一个指向最新节点可执行文件的符号链接:

container_commands:
  01_node_binary:
    command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
  • 我找到了最新版本的节点安装二进制文件
  • 我在 /bin 目录中创建了一个符号链接(它是 $PATH 的一部分)

【讨论】:

  • 下次部署应用时此脚本会失败
  • 谢谢@h-kippo 我更新了它,所以如果符号链接已经存在(如果这是问题),它会强制创建符号链接
  • 澄清一下,这应该放在像.ebextensions/nodepath.config 这样的文件中,对吧?
【解决方案4】:

我在我的项目文件夹中创建了文件/.ebextensions/node.config 来声明我的节点版本并将符号链接添加到 /bin 文件夹。关于 .ebextensions 文件夹的更多信息可以在这里找到:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

option_settings:
  - option_name: NodeVersion
    value: 0.12.2
files:
  "/bin/node" :
    mode: "755755"
    content: "/opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/node"
  "/bin/npm" :
    mode: "755755"
    content: "/opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/npm"

【讨论】:

  • 这确实允许我在 ssh 进入我的 eb 实例时从任何路径运行 npm 和节点,但由于某种原因,该命令永远不会“接受”参数。例如,npm install 只会列出 npm 的所有可能选项。
  • 这是因为这些被评估为 shell 脚本,而不是符号链接。请改用mode: "100755"
  • 根据最新的文档,您必须以“120xxx”开头才能创建符号链接:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
【解决方案5】:

您可以使用如下命令将最新的 nodenpm 二进制文件添加到 $PATH:

PATH=$PATH:`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin

我不知道如何防止 beanstalk 命令再次重置 $PATH。

如果您愿意,您可以使用与上述类似的命令创建符号链接,并将其用作 cron 脚本等中的参考点。

同意,很烦人。

【讨论】:

  • 或者按照 dorianm 的回答中的建议使用 $NODE_HOME 环境变量
  • sudo ln -sf ls -td /opt/elasticbeanstalk/node-install/node-* | head -1/bin/node /bin/node
猜你喜欢
  • 2013-08-16
  • 2014-09-15
  • 2016-03-11
  • 2018-12-10
  • 2019-06-19
  • 2016-05-25
  • 2016-06-07
  • 2017-01-12
  • 2018-01-29
相关资源
最近更新 更多