Jiff Slater
🤔 About
✍️ Contact
29 Oct 2020

Some Docker and Vagrant tips
11 December 2019

While I’m slowly migrating my blog over to WordPress, I’ve been experimenting with build environments on my Mac and Linux server using a combination of Docker, Vagrant, and Ansible. Here are some of the tips I’ve compiled to improve my effectiveness using these tools.


Building and running the current context with

docker run --rm `docker build -q .`

Cleaning up all the abandoned containers.

docker system prune -a

At some point you’ll find that you want to combine multiple builds into a single file. Luckily Docker now allows multi-stage builds, see here.


Vagrant can work together with Ansible if you add the playbook information in your Vagrantfile, like so:

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "../ansible/site.yml"

The login information will automatically be copied over so Ansible can run on the virtual machine. You can also view the config by running vagrant ssh-config in the directory of the virtual machine.


When using Ansible, it’s best to split up the tasks into roles so you can reuse them later. A typical directory layout looks like:

./site.yml [playbook]: starts the entire environment.
./hosts [yaml or INI file]: contains the list of hosts.  I prefer to use the YAML format here.
./roles [directory]
./roles/common [directory]: common tasks to run on each server
./roles/common/handlers [directory]: handlers specific to common but can be used anywhere
./roles/common/tasks [directory]: list of tasks to be executed by this role
./roles/common/files [directory]: any files that need to be deployed
./roles/common/templates [directory]: a collection of templates that can be deployed with the common role
./roles/common/vars [directory]: variables (that aren't in the defaults) for the common role
./roles/common/defaults [directory]: default values for the variables for the common role deployment
./roles/common/meta [directory]: configuration files related to managing ansible

I would spend a bit of time understanding static and dynamic importing (more information here) as I think the added flexibility has the potential to cause difficult to debug errors in deployments.

Roles are then included just like any other task.


- hosts: webservers
  - include_role:
      name: foo_app_instance