首页 > 解决方案 > AWS CodeDeploy [stderr]/usr/bin/env: node: No such file or directory

问题描述

当尝试在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 ,虽然不是同一个问题,但似乎可以解决我的问题,但事实并非如此。

我检查是否nvm已安装发行which 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)

但是,只发出nvmI recevienvm的 CLI 帮助命令没有任何问题。

我检查了.bashrc是否ec2-user正确导出了 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

启动服务器.sh

#!/bin/bash

echo "Restarting servers..."

/home/ec2-user/.nvm/versions/node/v15.2.0/bin/pm2 restart 0

codedpeloy 是否使用root用户发出这些命令,即使runas设置为ec2-user?我不明白发生了什么,它以前工作过。

标签: bashamazon-web-servicesamazon-ec2aws-code-deploy

解决方案


这归结为执行时不可用的节点路径。如果 node 是通过 nvm 安装的,请尝试添加正确的路径。

另一种方法是添加source ~/.nvm/nvm.sh到您的 bash 配置文件(或适当的文件,具体取决于您的环境)。请参阅节点版本管理器安装 - 未找到 nvm 命令


推荐阅读