当前位置: 首页 > 面试题库 >

避免在弹性beantalk中重建node_modules

史承福
2023-03-14
问题内容

我们有一个相当简单的node.js应用程序,但是由于AWS Elastic Beanstalk部署机制,git aws.push即使提交了一个文件,也需要大约5分钟(通过)推出新版本。

即,提交本身(和上载)非常快(仅可推送1个文件),但是Elastic Beanstalk从S3获取整个包,将其解压缩并运行npm install,这导致node-gyp编译一些模块。安装/构建完成后,Elastic
Beanstalk会擦除/var/app/current并用新的应用程序版本替换它。

不用说,恒定的node_modules重建是不必要的,在我的旧Macbook
Air上重建需要30秒,而在ec2.micro实例上花费的重建时间超过5分钟,这并不有趣。

我在这里看到两种方法:

  1. 调整/opt/containerfiles/ebnode.py并使用node_modules位置,以避免在部署时将其删除和重建。
  2. 在Elastic Beanstalk EC2实例上设置git repo并基本上自己重新编写部署过程,因此/ var / app / current接收推送并npm install仅在必要时运行(这使Elastic Beanstalk看起来像OpsWorks。)

这两个选项都缺乏宽容,并且在Amazon更新其Elastic Beanstalk挂钩和体系结构时容易出现问题。

也许有人有一个更好的主意,如何避免不断重建应用目录中已经存在的node_modules?谢谢。


问题答案:

谢谢基里尔,这真的很有帮助!

我只是将配置文件共享给只看过该解决方案的人npm install。该文件需要放置在.ebextensions项目的文件夹中,它较轻,因为它不包括节点安装的最新版本,并且可以使用。

它还动态检查安装的节点版本,因此无需将其包含在env.vars文件中。

.ebextensions/00_deploy_npm.config

files:
  "/opt/elasticbeanstalk/env.vars" :
    mode: "000775"
    owner: root
    group: users
    content: |
      export NPM_CONFIG_LOGLEVEL=error
      export NODE_PATH=`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh" :
    mode: "000775"
    owner: root
    group: users
    content: |
      #!/bin/bash
      . /opt/elasticbeanstalk/env.vars
      function error_exit
      {
        eventHelper.py --msg "$1" --severity ERROR
        exit $2
      }

      #install not-installed yet app node_modules
      if [ ! -d "/var/node_modules" ]; then
        mkdir /var/node_modules ;
      fi
      if [ -d /tmp/deployment/application ]; then
        ln -s /var/node_modules /tmp/deployment/application/
      fi

      OUT=$([ -d "/tmp/deployment/application" ] && cd /tmp/deployment/application && $NODE_PATH/npm install 2>&1) || error_exit "Failed to run npm install.  $OUT" $?
      echo $OUT
  "/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh" :
    mode: "000666"
    owner: root
    group: users
    content: |
       #no need to run npm install during configdeploy


 类似资料:
  • 我有一个弹性查询脚本,用于使用我给出的参数计算地面距离,我必须在多个查询中使用它。是否有一种方法可以避免这种重复,例如,有一种计算全局变量并在所有脚本中使用它的方法。在本例中,我希望计算<code>距离 映射:

  • 本文向大家介绍避免在MongoDB中重复输入?,包括了避免在MongoDB中重复输入?的使用技巧和注意事项,需要的朋友参考一下 为了避免在MongoDB中重复输入,可以使用。语法如下- 让我们实现以上语法。避免在MongoDB中重复条目的查询如下- 现在在上面的集合中插入一些记录。插入记录的查询如下- 每当您尝试再次插入相同记录时,都会出现此错误- 让我们插入另一条记录。查询如下- 在method

  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 问题内容: 我在django中使用django-rest-framework实现了REST api,并使用oauth2进行身份验证。 我测试了: 和 在本地主机上,成功结果与文档一致。 将其推送到现有的AWS Elastic beantalk实例时,我收到了: 问题答案: 我现在使用略有不同的方法。只要汤姆·迪金(Tom dickin)指出不改变环境变量,sahutchi的解决方案就可以工作。我在

  • 问题 你在类中需要重复的定义一些执行相同逻辑的属性方法,比如进行类型检查,怎样去简化这些重复代码呢? 解决方案 考虑下一个简单的类,它的属性由属性方法包装: class Person: def __init__(self, name ,age): self.name = name self.age = age @property def n

  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!