Many tools automatically look for a special file called
.env, which contains KEY=VALUE pairs, one per line. I am here referring to a file with the same syntax, but with arbitrary names. I use different names to distinguish between configurations for different development stages.
Using environment variables for configuration is pretty much accepted as good practice today for web applications. But it’s always a hassle to deal with them during development, if you are not using a specialised service for them. My current approach is to create separate *.env-file for the development and testing stage: development.env and testing.env. These files use regular bash-syntax for variable declaration:
| |
and here is the version for the testing-stage:
| |
The great thing about these files is that many popular tools support them in one way or the other. Either directly as command line arguments, or by using a shell script.
Here are some examples.
Using .env-files with docker compose
You can specify env-files both as part of your docker-compose.yml file or by passing it on the command line.
# Inside your docker-compose.yml
app:
env_file:
- development.yml
or by passing it on the command line:
$ docker compose --env-file env/development.env up -d
Note that these two uses are not semantically equivalent. The first makes all environment variables available to the app container, the second makes them only available during the build-process. Passing the --env-file parameter will not magically make those variables available to the container. For each variable you will still need to specify in each container’s environment:-section, which variables are made available.
Using .env-files with shell-scripts
The most robust way to use .env-files in a shell script seems to be this:
| |
Using .env-files with PyCharm IDE (or any IntelliJ based IDE)
PyCharm does not come with built-in support for using *.env-files for run-configurations, but there is a very popular and robust third-party plugin called EnvFile. It can be installed from Plugins-preference and let’s you specify one or more .env-files as sources for environment variables. If you want to see it in action, there are some screenshot in the official github repo..
Other uses
pipenvwill automatically load a file named.envif it is found in the project folder. There is no command line argument to override it, but luckily there is an environment variable to tellpipenvto look for a different file-name:PIPENV_DOTENV_LOCATION=development.env pipenv shellwill start pipenv-shell with the environment variables from your development.env file.Procfile-based application management tools, which have also been adopted by cloud providers like AWS and heroku. The originalforeman-repo has a list of ports for other languages.. You can specify different (and multiple) env-files using the--envcommand line parameter.- the ´python-dotenv´ library will load environment variables from a .env-file. In most cases I believe this an anti-pattern. After all, the whole idea of environment-variables was to get away from config-files. However, for python scripts that help you manage your environments, this might come in handy.
If you liked this post, please, do share it:
Thanks, for reading (and sharing)! 🥳