AWS CodeDeploy执行脚本时pm2与pnpm命令找不到问题求助
解决AWS CodeDeploy中pnpm/pm2命令找不到的问题
核心原因
CodeDeploy执行钩子脚本时使用非交互式、非登录Shell,不会自动加载~/.bashrc或~/.profile中的环境变量,导致nvm、pnpm、pm2的路径未被配置,最终触发退出码127(命令未找到)。
有效解决方案
1. 在钩子脚本中手动加载完整环境变量
在每个钩子脚本开头添加以下代码,确保nvm、Node、pnpm、pm2的环境变量被正确初始化:
#!/bin/bash # 加载NVM配置 export NVM_DIR="/home/ubuntu/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh" # 切换到指定Node版本(此处为22) nvm use 22 # 配置PNPM环境变量 export PNPM_HOME="/home/ubuntu/.local/share/pnpm" export PATH="$PNPM_HOME:$PATH" # 可选:调试用,输出当前PATH和命令位置到本地日志 echo "Current PATH: $PATH" >> /home/ubuntu/deploy_debug.log which pnpm >> /home/ubuntu/deploy_debug.log 2>&1 which pm2 >> /home/ubuntu/deploy_debug.log 2>&1
2. 指定脚本运行用户为ubuntu
在appspec.yml的钩子配置中添加runas: ubuntu,确保脚本以安装了nvm、pnpm、pm2的用户身份执行,避免root用户环境不一致的问题:
version: 0.0 os: linux files: - source: / destination: /home/ubuntu/app hooks: BeforeInstall: - location: scripts/install_deps.sh timeout: 300 runas: ubuntu ApplicationStart: - location: scripts/start_app.sh timeout: 300 runas: ubuntu ApplicationStop: - location: scripts/stop_app.sh timeout: 300 runas: ubuntu
3. 统一环境变量初始化脚本(可选)
创建一个单独的环境初始化脚本/home/ubuntu/deploy_env.sh,把所有环境配置集中管理:
#!/bin/bash export NVM_DIR="/home/ubuntu/.nvm" source "$NVM_DIR/nvm.sh" nvm use 22 export PNPM_HOME="/home/ubuntu/.local/share/pnpm" export PATH="$PNPM_HOME:$PATH"
然后在每个钩子脚本开头执行:
source /home/ubuntu/deploy_env.sh
验证要点
- 确保脚本的shebang为
#!/bin/bash,而非#!/bin/sh(sh不支持部分bash特性) - 检查
/home/ubuntu/.nvm、/home/ubuntu/.local/share/pnpm目录的权限,确保ubuntu用户可访问 - 通过调试日志确认
PATH中包含以下路径:$NVM_DIR/versions/node/v22.x.x/bin(pm2所在目录)$PNPM_HOME(pnpm所在目录)
内容的提问来源于stack exchange,提问作者Gipyo.Choi
相关产品推荐
相关产品推荐

