【问题标题】:Elastic Beanstalk run post deploy scriptElastic Beanstalk 运行部署后脚本
【发布时间】:2017-04-07 10:38:16
【问题描述】:

我的 node.js 应用由两部分组成,一个 express 后端和一个 react 前端。

我在这个结构中有两个 package.json 文件

package.json 
/app/package.json

我想做的是在我的前端文件夹 app 中运行一个脚本来构建我的代码。

我要运行的脚本是npm installnpm run build 部署完成后如何运行此脚本?

commands:
    01_app_npm_install:
        command: npm install
        cwd: app/
    02_app_npm_build:
        command: npm run build
        cwd: app/

但它返回一个错误说“没有这样的文件或目录 tory: 'app/'。”

这可以在 aws elastic beanstalk 上执行吗?

【问题讨论】:

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


    【解决方案1】:

    更新: 这现在得到了更多的发展和定义。

    https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

    原文:

    我自己没有用 Elastic Beanstalk 做过 nodejs,但是我做过很多 Django。

    commands: 部分在项目文件就位之前运行。例如,您可以在此处安装服务器软件包。

    container_commands: 部分在文件放入其最终目标(对于 nodejs 似乎是 /var/app/current)之前在暂存目录中运行。如果需要,您可以在此处修改文件。

    以上参考: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

    您还可以运行部署后脚本。这没有很好的记录(至少不是)。你可以这样做:

    files:
        "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
            mode: "000755"
            owner: root
            group: root
            content: |
                #!/usr/bin/env bash
                service httpd restart
    

    【讨论】:

    • 这为我指明了正确的方向,但是,从 AWS Linux 2 开始,这略有不同,请参阅:docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 您必须创建一个名为 .platform/hooks 的文件夹并放置 #! /usr/bin/env bash service httpd restart 直接进入文件
    【解决方案2】:

    感谢@gustaf 和其他一些网站,我设法将解决方案整合在一起。它不漂亮,但很有效。

    我在.ebextensions/01_build.config创建了一个文件

    commands:
      create_post_dir:
        command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
        ignoreErrors: true
    files:
      "/opt/elasticbeanstalk/hooks/appdeploy/post/99_build_app.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
          #!/usr/bin/env bash
          cd /var/app/current/app/
          sudo /opt/elasticbeanstalk/node-install/node-v6.2.2-linux-x64/bin/npm install
          sudo /opt/elasticbeanstalk/node-install/node-v6.2.2-linux-x64/bin/npm run build
    

    对节点版本进行硬编码并不完美,但目前可以使用。

    【讨论】:

    • 我认为您不需要创建该目录,它应该已经存在。我不必在 python 环境中这样做。如果需要,您显然也可以在 container_commands 中将文件移动到该目录中。
    • 感谢您的回答。一个问题,我使用了您的答案,但无法弄清楚在构建反应应用程序时如何设置环境变量。即使我在 GUI 配置中设置它也是未定义的。你有遇到同样的问题吗?
    【解决方案3】:

    如果您参考文档,您会发现 container_commands 是您应该放置应用相关内容的位置。

    文件是根据各个部分的偏好执行的,commands 是第一个,container_commands 是最后一个。在此阶段,应用尚未复制到所需位置 (/var/app/current)。

    另外,如果您设置环境变量,这些将仅在 container_commands 中提供给您。

    【讨论】:

    • 即使我把它改成 container_commands 还是找不到目录 app/.我在名为 .ebextensions 的目录中有 .config 文件,对吗?
    【解决方案4】:

    从 Amazon Linux 2 开始,您必须使用 Platform Hooks。此处的其他答案仅适用于 Amazon Linux AMI 平台版本。

    例如,在您的应用程序根目录中,创建

    .platform/hooks/postdeploy

    文件夹,然后创建一个名为 service-httpd-restart.sh 的文件

    内容为

    #!/usr/bin/env bash
    service httpd restart
    

    Gustaf's comment做同样的事情。

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 2014-11-09
      • 2018-07-19
      • 2018-04-16
      • 2015-06-30
      • 2012-10-25
      • 2017-07-26
      • 2020-08-17
      • 1970-01-01
      相关资源
      最近更新 更多