我正在通过 codecommit/codebuild/codedeploy 将 Nodejs 应用程序部署到 AWS 上的 EC2 实例。在我的 codedeploy 的 appspec.yml 文件中,我有一个名为 application_start.sh 的脚本,该脚本在应用程序启动时调用。我用它来重新启动pm2。
#!/bin/bash
pm2 delete /home/ubuntu/server/app.js 2> /dev/null
CREDENTIALS_SOURCE=$CREDENTIALS_SOURCE pm2 start /home/ubuntu/server/app.js --update-env
正如您所看到的,我有一个 env 变量 ($CREDENTIALS_SOURCE),我在 bash 脚本中读取该变量来为我的 Nodejs 代码设置一个 env 变量。
问题是:当脚本第一次运行(自动通过 aws 管道)时,不会读取 $CREDENTIALS_SOURCE 变量,并且服务器崩溃。当我通过 SSH 连接到服务器并执行与 sh 脚本中完全相同的命令时,它就可以工作了。
当我将 bash 脚本更改为CREDENTIALS_SOURCE=dev
,因此硬编码“dev”而不是从服务器环境变量中读取它时,它也可以工作。
我export CREDENTIALS_SOURCE=dev
在 .bashrc 中(并获取了它)。当我这样做时,printenv
我会看到环境变量。
答案1
我找到了一个解决方案,它有效,但我不知道这是否是正确的方法。
显然,pm2 无法从服务器读取环境变量。当我运行node app.js
而不是运行时pm2 start app.js
,nodeJS 应用程序可以访问 env 变量。
使用以下命令,我让它适用于 pm2:
sudo -E pm2 start app.js
我的猜测是 env 变量不是存储在 ubuntu 用户中,而是存储在 root (sudo) 用户中。它是否正确?
以上并不是完美的解决方案。更好的解决方案:
- 添加
export CREDENTIALS_SOURCE=dev
/etc/profile
source /etc/profile
在application_start.sh
开始之前添加pm2
这有效!
资料来源: