View Source Jetenv
Full Application configuration from only the environment by using a predictable and direct name translation into config node plus type specification and bundled/armored encoding for complex types.
Background
Given that Application configuration is a tree data structure comprised of Keyword lists, addressing any point in the KW hierarchy can be expressed as a path. If the implied root of the structure is the application controller and the next nodes are the applications (otp_app atoms), then a path can be built to locate/set configuration at any point.
Environment Design limits
The POSIX standards place limits on variable names, but none on values. Modern systems provide an ARG_MAX of about 4MiB, so considerable data space is available.
POSIX programs use upper case variable names, lower case is reserved for
applications. The only special character is the underscore _
.
Variable name construction
- Path segments are separated by a double underscore
__
- Variables use a common prefix (default is
je
), allows automatic configuration - A required type suffix allows automatic interpolation
Example:
je__my_app__some_thing__S="A string value"
Types supported
See Jetenv
Generator
Included is a mix task, mix jetenv.generate
that can emit documents that
can be used to perform environment set up for:
- docker api
- javascript (ts/CDK)
- shell
To see an example, run mix jetenv.generate elixir
.
Generation Limitations
A docker --env-file
is not directly supported because that format
doesn't support multi-line values. The format is neither shell nor
json. It has no escaping mechanism.
For deployment into any orchestration, this is not usually a problem. For local docker development it is a hassle. One option it to generate a shell format file and source it within the container prior to starting elixir. The other approach is to use the Docker API (which is JSON) to create and then start a container.
Use
In your config/runtime.exs add:
Jetenv.load_env()
This will load from the environment using the default prefix je
.
Loaded applications
The Jetenv.load_env()/0
function will filter available configuration
to include only loaded applications. Use Jetenv.load_all_env()/0
to bypass that filter. If Application does not know about
an otp_app in that case, you will see a warning:
You have configured application :app in your configuration file,
but the application is not available.
This usually means one of:
1. You have not added the application as a dependency in a mix.exs file.
2. You are configuring an application that does not really exist.
Please ensure :app exists or remove the configuration.
This message is harmless.
Installation
If available in Hex, the package can be installed
by adding jetenv
to your list of dependencies in mix.exs
:
def deps do
[
{:jetenv, "~> 0.1.0"}
]
end
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/jetenv.