You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:57:06