Search code examples
javascriptnode.jspm2

Load a variable from dotenv file when starting PM2


I am starting instances of my app as a package.json script with PM2 this way:

"start:pm2": "pm2 start -i max node myapp.js"

I found out that not all members in the team always want to use max as a value for instances number while developing, but prefer to use some lower value.

To not change package.json I would better let them change the value inside .env file because we already use it so that the value from it would be used as the parameter to pm2.

I know I can create a wrapper js or bash script to load the variable from .env file and pass it to pm2 but it would be better to have a solution without it.

How can I achieve this?


Solution

  • A better pattern here is to remove dotenv from your code and "require" it on the command line. This makes your code nicely transportable between any environment (including cloud-based) - which is one of the main features of environment variables.

    a) code up your .env file alongside your script (e.g. app.js)

    b) to run your script without pm2:

    node -r dotenv/config app.js
    

    c) in pm2.config.js:

    module.exports = {
      apps : [{
        name      : 'My Application',
        script    : 'app.js',
        node_args : '-r dotenv/config',
        ...
      }],
    }
    

    and then pm2 start pm2.config.js

    Note: the use of dotenv/config on the command line is one of the best practices recommended by dotenv themselves