Thoughts on docker and making it better

Docker works, and I fully recommend using it for basically everything you deploy.

This said, I think there is massive room for improvement. Layers are a pretty terrible way to handle defining an environment.

Take this example

FROM ubuntu:latest

RUN  apt-get -y update && \
     apt-get install -y apache2 \
                    git \
                    golang \
                    python

When you add a new dependency, you then rerun everything on the run line, including re-downloading all the previously downloaded dependencies. Not to mention if the packages upstream changed, your docker image won't be the same between runs.

A much better approach would be for your container tech to more directly handle dependencies. For example

{
  // Describes a specific point in time
  "version": "F58C0AEFBFEBFBBB4112", 
  "devDependencies": ["git","golang","python"],
}

Where rather than re-downloading each, the container tech grabs only the ones that haven't previously been downloaded.

Several notes

  • You can of course setup a cache for these dependencies so it doesn't actually fetch from a remote location. I don't think most devs have that setup for their machines though.
  • Nix can pretty much do this, however it seems to have a huge learning curve when I've tried it.