dump-env
takes an .env.template
file and some optional environmental variables to create a new .env
file from these two sources. No external dependencies are used.
Why?¶
Why do we need such a tool? Well, this tool is very helpful when your CI is building docker
(or other) images.Previously we had some complex logic of encrypting and decrypting files, importing secret keys and so on.Now we can just create secret variables for our CI, add some prefix to it, and use dump-env
to make our life easier.
Installation¶
The Action looks for environment variables that start with envkey and creates an envfile with them. These are defined in the with section of the Action config. Here is an example of it in use. Hey @themagicbean!I faced the same issue recently, you can try uploading a.env file from your device. It works for me:D. An envfile, is a convenient way to pass many environment variables to a single command in one batch. This should not be confused with a.env file. Setting ARG and ENV values leaves traces in the Docker image. Don’t use them for secrets which are not meant to stick around (well, you kinda can with multi-stage builds).
Quickstart¶
This quick demo will demonstrate the main and the only purpose of dump-env
:
This command will:
take
.env.template
parse its keys and values
read all the variables from the environment starting with
SECRET_ENV_
remove this prefix
mix it all together, environment vars may override ones from the template
sort keys in alphabetic order
dump all the keys and values into the
.env
file
Advanced Usage¶
Multiple prefixes¶
This command will do pretty much the same thing as with one prefix. But, it will replace multiple prefixes.Further prefixes always replace previous ones if they are the same.For example:
Strict env variables¶
In case you want to be sure that YOUR_VAR
existsin your environment when dumping, you can use --strict
flag:
Oups! We forgot to create it! Now this will work:
Any number of --strict
flags can be provided.No more forgotten template overrides or missing env vars!
Source templates¶
You can use an env template as a source template by using the -s
or --source
argument. This will restrict any non-prefixed variables found in the environment to only those already defined in your template.
You can still also use prefixes to add extra variables from the environment
Strict Source¶
Using the --strict-source
flag has the same effect as defining a --strict
flag for every variable defined in the source template.
Creating secret variables in some CIs¶
Real-world usages¶
Projects that use this tool in production:
Related¶
You might also be interested in:
License¶
API Reference¶
dump
(template:str=', prefixes:Optional[List[str]]=None, strict_keys:Optional[Set[str]]=None, source:str=', strict_source:bool=False) → Dict[str, str][source]¶This function is used to dump .env
files.
As a source you can use both:1. env.template file ('
by default)2. env vars prefixed with some prefix ('
by default)
template – The path of the
.env
template file,use an empty string when there is no template file.prefixes – List of string prefixes to use only certain envvariables, could be an empty string to use all available variables.
strict_keys – List of keys that must be presented in env vars.
source – The path of the
.env
template file,defines the base list of env vars that should be checked,disables the fetching of non-prefixed env vars,use an empty string when there is no source file.strict_source – Whether all keys in source template must also bepresented in env vars.
Ordered key-value pairs of dumped env and template variables.
StrictEnvException – when some variable from template is missing.
main
() → NoReturn[source]¶Runs dump-env script.
Example
This example will dump all environ variables:
This example will dump all environ variables starting with PIP_
:
This example will dump all environ variables starting with PIP_
and update them with variables starting with SECRET_
:
This example will dump everything from .env.template
fileand all env variables with SECRET_
prefix into a .env
file:
Conda Create Env File
This example will fail if REQUIRED
does not exist in environ:
This example will dump everything from a source .env.template
filewith only env variables that are defined in the file:
This example will fail if any keys in the source template do not existin the environment:
Python environments provide sandboxes in which packages can be added.Conda helps us deal with the requirements and dependencies of those packages.Occasionally we find ourselves working in a constrained remote machine whichcan make development challenging. Suppose we wanted to take our exact devenvironment on the remote machine and recreate it on our local machine.While conda relieves the package dependency challenge, it can be hard toreproduce the exact same environment.
Creating a Portable Python Environment
This walkthrough will demonstrate a method to copy an exact environment onone machine and transfer it to a another machine. We'll start by collectingthe package requirements of a given set of python files, create an environmentbased on those requirements, then export it as a tarball for distribution on atarget machine.
Setup
Sample files
For this walkthrough we'll assume you have a folder with some python filesas a rudimentary 'package'.
If you want to create some example files, run the following commands:
mkdir -p ./test_package
echo 'import scipy' >> ./test_package/first_file.py
echo 'import numpy' >> ./test_package/first_file.py
echo 'import pandas' >> ./test_package/second_file.py
echo 'import sklearn' >> ./test_package/second_file.py
Each file has a few import statements - nothing fancy.
Extracting the required packages
In order to roll up the environment for the package, we first need to know whatthe package requires. We will collect all the dependencies and create an environment file.
Get direct dependencies
The first step is to collect dependencies. We'll do this usingdepfinder. It can be installed into yourenvironment: conda install -c conda-forge depfinder
This will be as simple as calling depfinder
on our test_package
directory.We add the -y
command to return yaml format.
depfinder -y ./test_package
This command returns a YAML formatted list with our dependencies. We are interestedin the required
dependencies, which are the external package requirements.
Create a temporary environment
Now we have a list of the direct dependencies but what about all the sub-dependencies?To capture these, we'll create a temporary environment.
Copy the yaml formatted dependencies into an environment file named environment.yml
.
Create .env File React
Notice that we've added two extra packages to our environment.yml
.In this example, we'll set a minimum python version to include in the package.We could also have explicitly set the Python version. You may notice that wehave also added an additional package called called conda-pack
. This will be usedfor wrapping up the environment for distribution - more on that later.
Create a conda environment from this yaml that will include all of the necessarydependencies.
conda env create -f environment.yml
Activate the temporary conda env:
conda activate my_env
Wrap up the environment into a tarball
At this point, we're ready to wrap up our environment into a single tarball.To do this, we'll use a package called conda-pack
. Conda-pack
is going to help uswrap up our exact environment, including python itself. This means that the target machineis not required to have python installed for this environment to be utilized. Much of whatfollows is taken directly from the conda-pack
docs.
Pack environment my_env into out_name.tar.gz
conda pack -n my_env -o my_env.tar.gz
Unpacking the environment on the target machine
At this point you will have a portable tarball that you can send to a differentmachine. Note that the tarball you've created must only be used on target machineswith the same operating system.
Now we'll go over how to unpack the tarball on the target machine and utilize thisenvironment.
Unpack environment into directory my_env
:
$ mkdir -p my_env
$ tar -xzf my_env.tar.gz -C my_env
We could stop here and start using the python environment directly. Note that mostPython libraries will work fine, but things that require prefix cleanups (sincewe've built it in one directory and moved to another) will fail.
$ ./my_env/bin/python
Alternatively we could activate the environment. This adds my_env/bin
to your path
$ source my_env/bin/activate
Create .env File Ubuntu
And then run python from the activated environment
(my_env) $ python
Cleanup prefixes from inside the active environment.Note that this command can also be run without activating the environmentas long as some version of python is already installed on the machine.
Create .env File Windows
(my_env) $ conda-unpack
At this point the environment is exactly as if you installed it hereusing conda directly. All scripts should be fully functional, e.g.:
(my_env) $ ipython --version
When you're done, you may deactivate the environment to remove it from your path
(my_env) $ source my_env/bin/deactivate
Conclusion
We've successfully collected the Python package requirements for a set of Python files.We've created the environment to run those files and wrapped that environment into atarball. Finally, we distributed the tarballed environment onto a different machine andwere immediately able to utilize an identical copy of Python environment from theoriginal machine.