如何向PM2传递自定义参数 解决dotenv环境配置文件不加载问题
问题原因
- 相对路径基准不匹配:PM2默认以执行pm2启动命令的目录作为相对路径的计算基准,你配置中
dotenv_config_path=../../dev.env的相对路径是相对于脚本./packages/api/index.js所在目录编写的,和PM2默认的路径基准不一致,导致找不到dev.env文件。
可行解决方案
方案1:显式指定PM2工作目录(推荐,适配原有相对路径写法)
在PM2配置中新增cwd字段,指定工作目录为脚本所在的./packages/api,即可让原有相对路径正常生效,修改后配置如下:
{ name: "api", script: "./index.js", cwd: "./packages/api", // 新增:指定工作目录为index.js所在目录 watch: true, node_args: "-r dotenv/config", args: ["dotenv_config_path=../../dev.env"], env: { NODE_ENV: "development", }, }
方案2:使用绝对路径避免歧义
如果你使用的是JS格式的PM2配置文件(ecosystem.config.js),可以通过Node.js的path模块拼接绝对路径,完全规避相对路径的基准问题,示例如下:
const path = require('path') module.exports = { apps: [{ name: "api", script: "./packages/api/index.js", watch: true, node_args: "-r dotenv/config", // 假设dev.env放在项目根目录,ecosystem.config.js也存放在根目录 args: [`dotenv_config_path=${path.resolve(__dirname, './dev.env')}`], env: { NODE_ENV: "development", }, }] }
方案3:通过环境变量直接指定配置路径
dotenv预加载模块支持直接读取DOTENV_CONFIG_PATH环境变量,你可以直接在PM2的env配置项中添加该变量,无需通过args传递,写法更简洁:
{ name: "api", script: "./packages/api/index.js", cwd: "./packages/api", // 仍建议搭配cwd使用保证路径正确 watch: true, node_args: "-r dotenv/config", env: { NODE_ENV: "development", DOTENV_CONFIG_PATH: "../../dev.env" }, }
生效验证
修改配置后执行以下命令重启进程即可验证:
- 停止删除旧进程:
pm2 delete api - 加载新配置启动:
pm2 start <你的PM2配置文件名> - 查看运行日志确认变量加载:
pm2 logs api
内容的提问来源于stack exchange,提问作者ShaSha
相关产品推荐
相关产品推荐

