除非手动执行,否则Elastic Beanstalk上的“npm install”会失败

我有一个PHP应用程序的Elastic Beanstalk环境。 我想在应用程序部署完成后运行npm install

nodenpm都通过deploy configs安装在服务器上。 我已经定义了一个容器命令来简单地cd到正确的目录,然后运行npm install ,但是它always以相同的错误失败。

如果我手动执行npm install ,所有东西都完美安装。

我怎么去debugging呢?

deploy.config

 commands: 01_mkdir_webapp_dir: # use the test directive to create the directory # if the mkdir command fails the rest of this directive is ignored test: 'mkdir /home/webapp' command: 'ls -la /home/webapp' 02_chown_webapp_dir: command: 'chown webapp:webapp /home/webapp' 03_chmod_webapp_dir: command: 'chmod 700 /home/webapp' 04_node_install: cwd: /tmp test: '[ ! -f /usr/bin/node ] && echo "node not installed"' command: 'yum install -y nodejs --enablerepo=epel' 05_npm_install: cwd: /tmp test: '[ ! -f /usr/bin/npm ] && echo "npm not installed"' command: 'curl -L http://npmjs.org/install.sh | sh' 06_node_update: cwd: /tmp test: '[ ! -f /usr/bin/n ] && echo "node not updated"' command: 'npm install -gn && n stable' # These commands will be run just before the application is started container_commands: 01_npm_build: cwd: '/var/app/ondeck/wp-content/themes/gift-certificates' command: 'npm install && npm run build' 

npm-debug.log尾部

 ... 90557 silly lifecycle gifsicle@3.0.4~install: no script for install, continuing 90558 silly install imagemin-gifsicle@4.2.0 /var/app/ondeck/wp-content/themes/gift-certificates/node_modules/.staging/imagemin-gifsicle-836840bb 90559 info lifecycle imagemin-gifsicle@4.2.0~install: imagemin-gifsicle@4.2.0 90560 silly lifecycle imagemin-gifsicle@4.2.0~install: no script for install, continuing 90561 silly install jpegtran-bin@3.1.0 /var/app/ondeck/wp-content/themes/gift-certificates/node_modules/.staging/jpegtran-bin-6b358de8 90562 info lifecycle jpegtran-bin@3.1.0~install: jpegtran-bin@3.1.0 90563 silly rollbackFailedOptional Finishing 90564 silly runTopLevelLifecycles Starting 90565 silly runTopLevelLifecycles Finishing 90566 silly install printInstalled 90567 warn optional Skipping failed optional dependency /chokidar/fsevents: 90568 warn notsup Not compatible with your operating system or architecture: fsevents@1.0.14 90569 verbose stack Error: node-sass@3.10.0 install: `node scripts/install.js` 90569 verbose stack spawn ENOENT 90569 verbose stack at errnoException (child_process.js:1011:11) 90569 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:802:34) 90570 verbose pkgid node-sass@3.10.0 90571 verbose cwd /var/app/ondeck/wp-content/themes/gift-certificates 90572 error Linux 4.4.15-25.57.amzn1.x86_64 90573 error argv "node" "/usr/local/bin/npm" "install" 90574 error node v6.6.0 90575 error npm v3.10.3 90576 error file sh 90577 error code ELIFECYCLE 90578 error errno ENOENT 90579 error syscall spawn 90580 error node-sass@3.10.0 install: `node scripts/install.js` 90580 error spawn ENOENT 90581 error Failed at the node-sass@3.10.0 install script 'node scripts/install.js'. 90581 error Make sure you have the latest version of node.js and npm installed. 90581 error If you do, this is most likely a problem with the node-sass package, 90581 error not with npm itself. 90581 error Tell the author that this fails on your system: 90581 error node scripts/install.js 90581 error You can get information on how to open an issue for this project with: 90581 error npm bugs node-sass 90581 error Or if that isn't available, you can get their info via: 90581 error npm owner ls node-sass 90581 error There is likely additional logging output above. 90582 verbose exit [ 1, true ] 

eb-commandprocessor.log尾部

  ... | `-- osenv@0.0.3 +-- chalk@0.5.1 | +-- ansi-styles@1.1.0 | +-- has-ansi@0.1.0 | | `-- ansi-regex@0.2.1 | +-- strip-ansi@0.3.0 | `-- supports-color@0.2.0 +-- glob@4.5.3 | +-- inflight@1.0.5 | | `-- wrappy@1.0.2 | `-- once@1.4.0 +-- lodash@2.4.2 +-- propprop@0.3.1 `-- through2@0.6.5 `-- readable-stream@1.0.34 `-- isarray@0.0.1 npm WARN optional Skipping failed optional dependency /chokidar/fsevents: npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.14 npm ERR! Linux 4.4.15-25.57.amzn1.x86_64 npm ERR! argv "node" "/usr/local/bin/npm" "install" npm ERR! node v6.6.0 npm ERR! npm v3.10.3 npm ERR! Callback called more than once. npm ERR! npm ERR! If you need help, you may report this error at: npm ERR! <https://github.com/npm/npm/issues> npm ERR! Please include the following file with any support request: npm ERR! /var/app/ondeck/wp-content/themes/gift-certificates/npm-debug.log (ElasticBeanstalk::ExternalInvocationError) [2016-09-20T17:38:57.831Z] ERROR [4286] : Command CMD-AppDeploy failed! [2016-09-20T17:38:57.837Z] INFO [4286] : Command processor returning results: {"status":"FAILURE","api_version":"1.0","results":[{"status":"FAILURE","msg":"(TRUNCATED)...\nnpm ERR! If you need help, you may report this error at:\nnpm ERR! <https://github.com/npm/npm/issues>\n\nnpm ERR! Please include the following file with any support request:\nnpm ERR! /var/app/ondeck/wp-content/themes/gift-certificates/npm-debug.log. \ncontainer_command 01_npm_build in .ebextensions/deploy.config failed. For more detail, check /var/log/eb-activity.log using console or EB CLI","returncode":1,"events":[]}],"truncated":"true"} 

对于在PHP Elastic Beanstalk实例上遇到此问题的其他人,以下是帮助我解决的一些问题:

1)如果你运行在Amazon Linux实例上,执行yum install nodejs会给你一个超级老版本,这很可能与许多事情不兼容。 我必须添加一个脚本到我的.ebextensions目录并从我的一个配置执行它来安装更新版本的nodejs。 这是该脚本的副本:

 #!/bin/bash hash_file="/tmp/nodejshash" check_if_npm_packages_has_to_be_installed () { if [ -f $hash_file ]; then check_if_same_hash else return 0 fi } check_if_same_hash () { hash_new="$(md5sum .ebextensions/bin/install-nodejs.sh 2> /dev/null | cut -d ' ' -f 1)" hash_current="$(cat "$hash_file" 2> /dev/null | cut -d ' ' -f 1)" if [ $hash_new == $hash_current ]; then return 1 else return 0 fi } install_node () { if hash nodejs 2> /dev/null; then echo 'nodejs install, add more processing if needed' > /dev/null else curl -sL https://rpm.nodesource.com/setup_6.x | bash - yum install -y nodejs fi } install_npm_packages () { npm install -g bower npm install -g gulp } update_current_hash () { echo $hash_new > $hash_file } install_node if check_if_npm_packages_has_to_be_installed; then install_npm_packages update_current_hash fi 

2)如果默认情况下是在微型实例上,那么node-sass包需要很长时间来构建,并最终超时。 我增加了我的实例大小到一个t2.small来通过这个。

希望这可以帮助别人。