Render Go templates on the command line with shell environment variables
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
cmd updates for AMP Jan 10, 2017
test updates for AMP Jan 10, 2017
vendor/ updates for AMP Jan 10, 2017
.gitignore Update .gitignore Jan 11, 2017
Dockerfile updates for AMP Jan 10, 2017
LICENSE added license Jun 1, 2016 Update Jun 18, 2018 updates for and Sep 8, 2016
envtpl alpine binary currently needed for docker hub build Jan 11, 2017
glide.lock updates for AMP Jan 10, 2017
glide.yaml updates for AMP Jan 10, 2017
main.go initial commit May 31, 2016 updates for AMP Jan 10, 2017

Docker Pulls


envtpl renders Go templates on the command line using environment variables.

It is directly inspired by the original envtpl, a Python tool for rendering Jinja2 templates.

This port was motivated by the desire to add templating support for template-driven configuration files that needed to be part of a base Docker image without also requiring the installation of Python. For the same reason, I decided not to add variable support to my previous template utility njx, which depends on Node.js.

Despite the difference between Jinja and Go templates, an attempt was made to match the command line syntax of the original envtpl.

The biggest obvious difference is that Go template variables represent a path within a data context, so envtpl variables will need to be prepended with a leading . to match the keys of the internal environment variable map object (see example).


envtpl [-o|--output outfile] [template]
  • If template is not provided, envtpl reads from stdin
  • If outfile is not provide, envtpl writes to stdout



Hello {{.USER}}

Render the template (assume the value of $USER is 'mary')

envtpl greeting.tpl  # writes "Hello mary" to stdout

USER=bob envtpl greeting.tpl  # overrides "mary" and writes "Hello bob" to stdout

echo "greetings {{.USER}}" | envtpl  # writes "greetings mary" to stdout

envtpl < greeting.tpl > out.txt  # writes "Hello mary" to out.txt

cat greeting.tpl | envtpl > out.txt  # writes "Hello mary" to out.txt

test/test.tpl tests conditional functions as well as loop on environment variables. the test/test/sh script compares the output of envtpl with the expected output and can be used as unit test.

Template Functions

In addition to the standard set of template actions and functions that come with Go, envtpl also incorporates sprig for additional, commonly used functions.

For example:

echo "Greetings, {{.USER | title}}" | envtpl  # writes "Greetings, Mary" to stdout

In the example, the environment name of the user mary is converted to Mary by the title template function.

Other functions

To mimic the environment function for the original envtpl, an environment function allows to filter the environment with a prefix string

{{ range $key, $value := environment "TAG_"  }}{{ $key }}="{{ $value }}"{{ end }}

filters all environment variables starting with TAG_.

Building an envtpl executable

The script can be used to build the envtpl executable. If you provide the alpine argument, it will build a binary for Alpine Linux. This build script is intended for Docker workflows; it does not require Go support, only Docker.

To build it for another system, export the GOOS and GOARCH environment variables.

Building an envtpl Docker image

Docker Build Status can be used to create an image for envtpl using the provided Dockerfile. It copies the envtpl binary from the repo directory after building it with Because the Dockerfile is based on the alpine image, be sure to first build an executable for Alpine with the alpine option (./ alpine).

An image is available on Docker Hub subfuzion/envtpl

Similar Tools

As mentioned above, this tool was inspired by the original envtpl project and motivated to provide something similar without adding a Python dependency to Docker base images.

A search for similar Go-based tools turns up the following:

I haven't spent any time evaluating either yet. However, mattrobenolt/envtpl looks elegantly simple and arschles/envtpl offers tests, glide package management support and more template functionality using sprig.

Neither of these two packages appear to conform to the original envtpl command line syntax, which was one of my goals, although I don't think this is a big deal since all of these spin-off versions use an entirely different template syntax anyway. However, at first glance at least, this variant does offer more input/output options modeled after the original.

I'm inspired by arschles/envtpl to add sprig support for extended template functions, potentially glide support, and definitely tests. This version now has sprig template support also (credit to arschles/envtpl) and uses glide for vendoring.