AWS CodeDeploy [stderr]/usr/bin/env: node: 没有那个文件或目录。

3
尝试在“AfterInstall”事件上运行脚本时,我收到以下错误信息:
LifecycleEvent - AfterInstall
Script - deploy/install_dependencies.sh
[stdout]Install dependencies. /
[stderr]/usr/bin/env: node: No such file or directory

这很奇怪,因为:

  1. which node 的结果是:~/.nvm/versions/node/v15.2.0/bin/node
  2. which npm 的结果是:~/.nvm/versions/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-userpermissions 键及其值。文章链接为:Start Node Application in AfterInstall Hook。虽然那篇文章和我的问题不完全相同,但我认为这样做可以解决我的问题,但事实证明并没有。
我发现使用命令 which 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,我可以顺利地接收到nvm的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

即使为 ec2-user 设置了 runas,codedpeloy 是否仍然使用 root 用户来发出这些命令?我不明白发生了什么事,以前它是可以运行的。

3个回答

1
为了补充Devin的答案,我添加了以下内容。
source ~/.nvm/nvm.sh

我将代码添加到after_install.sh文件的开头,问题得以解决。

这样可以将PM2和NVM的正确路径添加到部署用户的路径中。您可以在运行source命令之前和之后调用以下命令进行确认:

echo "$PATH"

1
这归结于在执行时找不到节点的路径。如果通过nvm安装节点,请尝试添加正确的路径。
另一种方法是将source ~/.nvm/nvm.sh添加到您的bash配置文件中(或适当的文件,具体取决于您的环境)。请参见Node版本管理器安装-nvm命令未找到

0
我发现尽管CodeDeploy是以我设置的非根用户运行的,但它并没有使用与该用户或root在命令行上使用的相同的环境变量。请尝试将以下行添加到您的脚本中进行调试:
echo `env`
echo `whoami`

我仍然不知道为什么。我的做法是在脚本中调用 npm install 之前先导出所需的路径:

export PATH=$PATH:/correct/path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接