- Docker installed and running with your intended user in the docker group (ie you can run docker commands as your intended user)
- yq (python yq, basically jq for yaml) If this is not installed in the current path, it will process .denv.yml config using yq within the denv container
These images give you a nice wrapper to run arbitrary commands as well as all of the nodeintegration/denv-* image commands inside a container as if it was a local binary
$ source /dev/stdin <<< "$(docker run nodeintegration/denv:latest boot)"
Binding to tag: latest
What this command does is give a denv function in bash:
$ type denv| grep function
denv is a function
$ type denv| grep function
denv-init is a function
If you are curious what this is exactly doing before you load it into your shell:
$ docker run nodeintegration/denv:latest cat /usr/local/bin/boot
$ docker run nodeintegration/denv:latest cat /workspace/bootstrap
What this denv
function does is create a wrapper to run the first argument to denv as a container.
By default the command will run inside the denv container with your current working directory mounted to /workspace. It is also run as your current uid/gid
$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l
$ denv cat /etc/issue
Welcome to Alpine Linux 3.9
Kernel \r on an \m (\l)
This configuration file for denv allows you to commit specific versions of commands you use within a repository perhaps or on your CI/CD system at the commit level It is evaulated per command
A list of key = value environment variables that will be passed to the container per command run This can be an empty value. denv WILL use the presence of a shell environment value over the value provided from .denv.yml Think of the value in .denv.yml as a default with the shell overriding it.
The docker image to use for this command. eg: terraform.image: hashicorp/terraform
If this is not present it will default to the value of ${cmd}
The docker image tag to use for this command. eg: terraform.tag: 0.11.0
The default value if not present is latest
If this is present it will strip the running command and replace it with this value. a use case of why you might want this is like so:
python-3.6.8.cmd: python
python-3.7.2.cmd: python
So it will always execute python
as python-3.6.8
useful if you are performing matrices etc
This is where it gets fun.
The function denv
looks for a file .denv.yml in your current working directory
It then looks for a key: commands:
and then if there is a sub key called the first argument you supply to denv ie:
cat .denv.yml
commands:
bash:
denv will then change the docker run image to be bash
for the command bash
with the tag of latest
Then lets say i want to run an image that doesnt match the command:
commands:
terraform:
image: hashicorp/terraform
denv will then for the command terraform use the hashicorp/terraform
image with the default tag of latest
...ok...ok but i want a specific tag not latest:
commands:
terraform:
image: hashicorp/terraform
tag: 0.11.11
Easy peasy:
global:
environment:
FOO:
BAR: baz
This will give you FOO and BAR as docker run environment variables It WILL use your current shells environment variables over the .denv.yml value e.g. with the above .denv.yml:
$ denv env | grep -E '^(FOO|BAR)'
BAR="baz"
FOO=""
$ FOO="bar" denv env | grep -E '^(FOO|BAR)'
BAR="baz"
FOO=bar
denv-init
This will scour your .denv.yml for all commands and what images/tags they want and do a docker pull on them