bash 脚本中未读取环境变量

bash 脚本中未读取环境变量

我正在通过 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) 用户中。它是否正确?


以上并不是完美的解决方案。更好的解决方案:

  1. 添加export CREDENTIALS_SOURCE=dev/etc/profile
  2. source /etc/profileapplication_start.sh开始之前添加pm2

这有效!

资料来源:

相关内容