Docker Dotenv

Today, I was preparing a Docker container for production release and found managing environment variables was a bit of a pain. As a ruby developer it's natural to me to use 12factor methodology for my environment so I wanted to use that with Docker.

EDIT: After I figured out my obscene way of doing it, I thought to check the docker helper page and sure enough, support is backed right in. You can simply pass in the location of the file using docker run --env-file=.env. That being said, I'm still publishing this to share what I learned about the shell and to serve as a reminder that I should always check the documentation more thoroughly.

Most tutorials described using docker-compose, but I'm deliberately not using that as I only want a single service. I'm also trying to learn as much about native Docker as possible before adding abstractions. After a few iterations I came up with the following shell command which I then put into a Makefile for easy re-use:

docker run `<.env xargs -I % echo "-e %"`

What that above code is doing is:

Using backslashes in-line with the Docker run command injects this concatenated string directly as if you were passing them yourself with multiple -e arguments.

There you have it, a highly overcomplicated way of passing a .env file to a Docker container. Although this isn't needed, I learned a lot about shell piping and concatenation using xargs.

Simplicity is prerequisite for reliability.