envtpl
Render jinja2 templates on the command line with shell environment variables
Installation
pip install envtpl
How-to
Say you have a configuration file called whatever.conf that looks like this
foo = 123
bar = "abc"
You can use envtpl to set foo and bar from the command line by creating a file called whatever.conf.tpl
foo = {{ FOO }}
bar = "{{ BAR }}"
If you run
FOO=123 BAR=abc envtpl < whatever.conf.tpl > whatever.conf
you'll get back the original whatever.conf.
You can also specify default values
foo = {{ FOO | default(123) }}
bar = "{{ BAR | default("abc") }}"
Running
FOO=456 envtpl < whatever.conf.tpl > whatever.conf
will generate
foo = 456
bar = "abc"
This is all standard Jinja2 syntax, so you can do things like
{% if BAZ is defined %}
foo = 123
{% else %}
foo = 456
{% endif %}
bar = "abc"
If an environment variable is missing, envtpl will throw an error
$ echo '{{ FOO }} {{ BAR }}' | FOO=123 envtpl
Error: 'BAR' is undefined
You can change this behaviour to insert empty strings instead by passing the --allow-missing flag.
Instead of reading from stdin and writing to stdout, you can pass the input filename as an optional positional argument,
and set the output filename with the --output-file (-o) argument.
envtpl -o whatever.conf whatever.conf.tpl
As a convenience, if you don't specify an output filename and the input filename ends with .tpl, the output filename will be the input filename without the .tpl extension, i.e.
envtpl whatever.conf.tpl
# is equivalent to
envtpl -o whatever.conf whatever.conf.tpl
By default, envtpl will delete the input template file. You can keep it by passing the --keep-template flag.
There's a special environment(prefix='') function that you can use as a kind of wildcard variable. If you have hello.tpl
hello = {{ FOO }}
{% for key, value in environment('MY_') %}{{ key }} = {{ value }}
{% endfor %}
and compile it using
FOO=world MY_baz=qux MY_foo=bar envtpl hello.tpl
You end up with
hello = world
baz = qux
foo = bar
What's the point?
I use this script quite a lot in Docker images. Usually I'll have the CMD execute some file, like /bin/start_container, that sets up the runtime configuration for the container by inserting environment variables into config files before starting the main process. A redis example could look like this
#!/bin/bash
# start_container
envtpl /etc/redis.conf.tpl
redis-server
This is the use case I've optimised for, so that's why envtpl by default will delete the original template file.
Metadata
Release files for envtpl 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| envtpl-0.8.0.tar.gz | 6.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| envtpl-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.8 kB
Release files / envtpl-0.8.0.tar.gz
| Download URL | envtpl-0.8.0.tar.gz |
|---|---|
| Size | 6.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
85540042eac00d1669a7d832f2c871181dd69a0a561af61fdb66dafb392bcd4e
|
|
BLAKE2b-256 checksum How to use checksums |
64bc487da4f199b4fb4aea9348130638eb79cd737639200a7066f7ed595e4c21
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Release files / envtpl-0.8.0-py3-none-any.whl
| Download URL | envtpl-0.8.0-py3-none-any.whl |
|---|---|
| Size | 4.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6b2921ac6bb2dd522e0358491226767936211e65a2fe2874d113f5c725874d10
|
|
BLAKE2b-256 checksum How to use checksums |
e4596a26a66e1c1f3102eb7f67fcaa6fef9a6a68bc8b4a0aa2a4438b05c4eac5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|