Docker is like MemCache, if you need it, then you need another programming language

(written by lawrence krubner, however indented passages are often quotes). You can contact lawrence at: lawrence@krubner.com, or follow me on Twitter.

Maybe this should suggest another route altogether?

Managing Cabal dependency hell. Most of our application development is in Haskell, and we’ve found we prefer specifying a Docker image than working with Cabal sandboxes. This is equally a gain on other programming platforms. You can replace virtualenv for Python and rvm for Ruby with Docker containers.

I agree that the use of Docker is being driven by the use of languages like Python and Ruby, but maybe the existence of Docker suggests that people should move away from Python and Ruby in any situation where they might need Docker? Isn’t it a lot easier to move to a language that allows you to create a single binary that contains all dependencies? I know that people often do that with Go, and on the JVM I am a big fan of uberjars, which do exactly that. No need for Docker, because my uberjar contains all dependencies (someone will ask, what if I needed to run different versions of the JVM on one machine? I would like to know why I would ever need to do that).

Both Ruby and Python espoused the idea of relying on Unix. Why build an app to count words in a document when you can use “wc”, and why put your CSV file into a hashmap so you can sort, when you can just “shell out” to the Unix command line and use “sort”, etc. Use Unix whenever possible — that is the Ruby way, and also Python goes down that road. And that attitude makes sense for applications that run on one server, where you can have some idea of which distro of Unix you are running, and what the environment is, and what your config. Better yet, back in the days when I only had to deploy to one server, I made sure that my development machine and my production machine were the same, and doing so was easy because there were only the 2 machines. But that idea starts to fall apart when you have dozens of apps on hundreds of servers. Then you have to go 1 of 2 routes:

1.) automate the standardization of your servers

2.) switch to a system that lets you bundle all dependencies together

Of these 2 options, clearly #2 is easier than #1. Vast and complex systems are being built to help with #1, but for #2, when I write a Clojure app, I type “lein uberjar” and I get an uberjar with all dependencies inside, a single binary file I can put anywhere on my servers.

Why does anyone want to go down the road suggested by #1?

Docker is like MemCache, if you think you need it, then you should switch to a different programming language.

Post external references

  1. 1
    https://news.ycombinator.com/item?id=8470206
Source