Correct .env file with serverless-dotenv-plugin
Solution 1
I am the author of serverless-dotenv-plugin. There was a logistical problem when trying to dynamically load env files from the provider or other options. I have since updated the plugin however so that you can dynamically load env files based what environment is set.
For example, if you run "NODE_ENV=production sls deploy" it will look for a file called .env.production. If it is not found, it will fallback to .env.
See the README for more detail https://github.com/infrontlabs/serverless-dotenv-plugin
Solution 2
I got your use case to work by just using the normal dotenv plugin.
In my serverless.yaml
, I specify environment variables to be loaded from a file based on the stage
parameter (dev
is default):
provider:
stage: ${opt:stage, 'dev'}
environment:
FOO: ${file(./config.${self:provider.stage}.js):getEnvVars.FOO}
BAR: ${file(./config.${self:provider.stage}.js):getEnvVars.BAR}
Then one file per stage that loads the environment variables from the right .env file
:
config.dev.js
:
require('dotenv').config({path: __dirname + '/dev.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;
config.production.js
:
require('dotenv').config({path: __dirname + '/production.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;
Instead of exporting every environment variables in each of the above config files, I created a helper file for this (environmentVariables.js
):
module.exports.getEnvVars = () => ({
FOO: process.env.FOO,
BAR: process.env.BAR
});
Last but not least the .env
files containing the actual variables. I named the files dev.env
and production.env
.
FOO=foo
BAR=bar
It works like a charm, the only downside being that you have to edit several different files whenever you want to add a new environment variable.
Related videos on Youtube
Sammy
Updated on June 04, 2022Comments
-
Sammy almost 2 years
I'm using the following as a custom
serverless-dotenv-plugin
plugin configuration:custom: dotenv: path: .env-${opt:stage, 'local'}
But what I'm really trying to get is that the environment be loaded from
.env
file when I give no arguments and.env.staging
file when I usestaging
as a CLI argument.I don't know how this can be reflected in
path
above. Any help please? -
Adrián Rodriguez over 3 yearsWhy are you requiring staging.env inside config.staging.js but then you say the file is named production.env?
-
Incinerator over 3 yearsThanks for spotting Adrián, it has been corrected now.