当尝试在AfterInstall
事件上运行脚本时,我收到:
LifecycleEvent - AfterInstall
Script - deploy/install_dependencies.sh
[stdout]Install dependencies. /
[stderr]/usr/bin/env: node: No such file or directory
,这很奇怪,因为:
哪个节点
产生:~/. nvm/version/node/v15.2.0/bin/node
npm
产生的:~/. nvm/version/node/v15.2.0/bin/npm
appspec. yml不是我设置的,但我认为它很简单:
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/deploy/
permissions:
- object: /
pattern: "**"
owner: ec2-user
hooks:
AfterInstall:
- location: deploy/install_dependencies.sh
- location: deploy/build.sh
- location: deploy/install_prd_dependencies.sh
- location: deploy/copy_overwrite.sh
# - location: deploy/migrations.sh
timeout: 300
runas: ec2-user
ApplicationStart:
- location: deploy/start_server.sh
timeout: 300
runas: ec2-user
我在阅读后添加了runas: ec2-user
和权限
键及其值:在AfterInstall Hook中启动节点应用程序,虽然不是同一个问题,似乎可以解决我的问题,但它没有。
我检查了是否安装了nvm
发出哪个nvm
,它不起作用:
[ec2-user@my-ip ~]$ which nvm
/usr/bin/which: no nvm in (/home/ec2-user/.nvm/versions/node/v15.2.0/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin)
但是,只发出nvm
I recevienvm
的CLI帮助命令没有任何问题。
我检查了ec2-user
的. bashrc
以查看是否正确导出了nvm(如本答案所示):
# User specific aliases and functions
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
所有脚本都对npm/node二进制文件使用绝对路径,示例:
install_dependencies.sh
#!/bin/bash
echo "Install dependencies. $(pwd)"
cd /home/ec2-user/deploy/
/home/ec2-user/.nvm/versions/node/v15.2.0/bin/npm install
start_server.sh
#!/bin/bash
echo "Restarting servers..."
/home/ec2-user/.nvm/versions/node/v15.2.0/bin/pm2 restart 0
codedpeloy是否使用root
user来发出这些命令,即使为ec2-user
设置了runas
?我不明白发生了什么,它以前工作过。
这归结为执行时节点的路径不可用。如果node是通过nvm安装的,请尝试添加正确的路径。
另一种方法是将source~/. nvm/nvm.sh
添加到您的bash配置文件(或适当的文件,取决于您的环境)。请参阅节点版本管理器安装-未找到nvm命令
为了扩展德文的回答,我补充道
source ~/.nvm/nvm.sh
我after_install.sh文件的开头,它成功了。
这为PM2添加了正确的路径
echo "$PATH"
我发现虽然CodeDeploy以我设置的非root用户身份运行,但它并没有使用该用户或root在命令行上使用的相同环境变量。尝试将这些行添加到您的脚本中进行调试:
echo `env`
echo `whoami`
我仍然不知道那是为什么。我所做的是在脚本中调用npm install
之前导出我需要的路径:
export PATH=$PATH:/correct/path