如何使用 .ebextensions 在 Amazon Elastic Beanstalk 中运行“npm install”
Posted
技术标签:
【中文标题】如何使用 .ebextensions 在 Amazon Elastic Beanstalk 中运行“npm install”【英文标题】:How to run `npm install` in Amazon Elastic Beanstalk with .ebextensions 【发布时间】:2016-02-06 18:46:21 【问题描述】:我想使用 eb deploy
命令在 Amazon Elastic Beanstalk 中部署我的 php 应用程序。但我的应用使用 gulp 来连接和缩小 scss 和 js。
所以我在文件.ebextensios/03npm.config
中尝试了这些命令
commands:
01-install-node:
command: "yum install nodejs npm --enablerepo=epel -y"
container_commands:
01-install-dependencies:
command: "npm install"
02-build:
command: "npm run build"
但最后我收到了这个错误
[Instance: i-c7800103] Command failed on instance. Return code: 1 Output: (TRUNCATED)...ttps://registry.npmjs.org/acorn npm http 304 https://registry.npmjs.org/amdefine npm http 304 https://registry.npmjs.org/wrappy npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /var/app/ondeck/npm-debug.log npm ERR! not ok code 0. container_command 01-install-dependencies in .ebextensions/03npm.config failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
我不确定,但似乎npm install
从一个可以忽略的包中收到错误,但它正在调度 EB 错误并停止整个过程。
我正在使用这台机器运行:64bit Amazon Linux 2015.09 v2.0.4 running PHP 5.6
有谁知道我们如何解决这个问题?
【问题讨论】:
我遇到了同样的问题。.ebextensions
中几乎相同的 .config 文件。你找到解决方案了吗,如果有,你愿意分享吗?谢谢。
我在 anwser 中发布我的解决方案以便更好地解释它
我昨天遇到了同样的问题,但不喜欢任何答案,在日志中找到了原因。具体来说,您想查看eb-activity.log
和eb-commandprocessor.log
以获得有关此错误的更多信息。我发现我的与我的 npm 安装本身有关。所以这不是eb
本身的问题,我修复了那个简单的 npm 错误,然后继续前进。希望这些信息对那里的人有所帮助=)
【参考方案1】:
这对我有用:
packages:
yum:
git: []
commands:
01_node_install:
cwd: /tmp
test: '[ ! -f /usr/bin/node ] && echo "node not installed"'
command: 'yum install -y nodejs --enablerepo=epel'
02_npm_install:
cwd: /tmp
test: '[ ! -f /usr/bin/npm ] && echo "npm not installed"'
command: 'sudo rm -rf /usr/bin/npm | curl -L http://npmjs.org/install.sh | sh'
03_node_update:
cwd: /tmp
test: '[ ! -f /usr/bin/n ] && echo "node not updated"'
command: 'npm install -g n && n stable'
container_commands:
# your container commands
【讨论】:
这是唯一对我有用的选项。谢谢! 这条评论绝对省时!【参考方案2】:到目前为止,我有这个丑陋的解决方案,但它有效。我在 package.json 中创建了这个脚本,它按顺序完成了这项艰巨的工作。它会创建一个新分支并提交已编译的文件,然后再将其部署到 EB
package.json
"scripts":
"production": "node ./node_modules/gulp/bin/gulp.js --production",
"deploy": "git checkout -b deploy && npm run production && git add . && git commit -m \"build\" && eb deploy && git checkout master && git branch -D deploy"
.elasticbeanstalk/config.yml
branch-defaults:
deploy:
environment: NAME_OF_ENVIRONMENT
【讨论】:
谢谢。我实际上最终使用了 Circle CI 和 Docker(因为我在 AWS Node.js 环境中的经验并不是最好的)。通过使用 Circle CI,我可以直接从 Github 进行部署。 IE。 Circle CI 将最新的push
带到例如master
,然后运行 npm install
,然后将项目构建到 distribution
文件夹中,然后将其传递给 EB。使用.ebignore
我可以忽略除distribution
文件夹和生产服务器之外的所有内容。因此,这些是传递给 AWS EB 的唯一文件。 AWS EB 从那里创建一个 Docker 容器并在大约 3-4 分钟内运行它。【参考方案3】:
packages:
yum:
git: []
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/03_npm_install.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
cd $EB_APP_STAGING_DIR
npm install bower
npm install
./node_modules/bower/bin/bower install --allow-root --config.interactive=false
./node_modules/grunt-cli/bin/grunt dust
【讨论】:
以上是关于如何使用 .ebextensions 在 Amazon Elastic Beanstalk 中运行“npm install”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .ebextensions 中获取负载均衡器的 ARN?
在 Elastic Beanstalk 中,如何使用 .ebextensions 将现有安全组设置为负载均衡器?
如何使用 .ebextensions 在 Amazon Elastic Beanstalk 中运行“npm install”
AWS Elastic Beanstalk:如何在 ebextensions 中使用环境变量?
如何使用 .ebextensions 将 Application Load Balancer 固定响应添加到 AWS Elastic Beanstalk