Hi Charles,
Sorry I know this is long, but please give this a detailed read.
In Windows - If you install CouchDB, you install CouchDB as one package, that's it. Everything required is bundled.
In Ubuntu 14.04 - If you install CouchDB, it will install 50 other packages (erlang-dev, erlang-http, couchdb-bin, couchdb-lib, etc, etc). Just install a fresh
Ubuntu and try running "apt-get install couchdb" on it, and you'll see that it asks "will install 50 packages, Y/N".
So one package depnds on X, X depends on Y, Y depends on Z and so on. e.g. couchdb depends on erlang-dev, which depends on [erlang-c6, erlang-bin, etc etc] - which in turn depends on [build-essential, curl] and usually culminating at the top level kernel-headers, glibc and libc6 dependencies.
And that's where fundamentally Dependency hell arises in Linux. You can run into that even within a single Ubuntu 14.04.
So if you install Docker - you need at least 10 other new packages, which in turn have some more core dependencies. We cannot make all these into one single package (Deeper linux folks: At this point you'll ask me about static linking, but here all these are core system services and not shared libraries, and most of the stuff are kernel modules as well!). It is extremely difficult because you'll have to manage every single dependency, and sometimes its flat impossible because of all the kernel modules involved in Docker.
Case example:
Default Ubuntu will not have any kernel development headers installed. But Docker needs those for compiling AUFS and other bits. So now you have to package kernel headers along with our DEB as well. But which version of kernel-headers will we pack? If you install fresh Ubuntu 14.04 - you'll have say kernel 3.13.0, and later when you do an apt-get update/upgrade - you'll have kernel 3.13.1. But we can't pack one single kernel-header. As you keep running apt-get update/upgrade - your distribution keeps changing and becomes a moving target. Hence a Matrix will be required even for simple Ubuntu 14.04 itself.
The only thing that works even inside a single Ubuntu:
We should NOT be managing or bundling dependencies. apt-get is the only thing in Ubuntu that is considered safe to take care of dependencies. So we just say "rapidftr depends on docker", and apt-get will install docker. If we start bundling Docker - then we should bundle docker's X dependencies, and Y dependencies, and Z and so on, which will break the system at one point.
If our dependencies are simply shared libraries (like libqt, libruby, etc) - we can do static linking (i.e. bundle all libraries along with our DEB). But unfortunately RapidFTR depends on Docker - which is all system and kernel components, packaging those with RapidFTR will be a definite recipe for incompatibilities.
This is a fundamental problem with Linux and that's why we can't subvert apt-get. On Windows, its a separate story because Windows doesn't install 50 things when you install one. Everything is by default statically linked, and there are very little shared libraries in Windows.
- Subhas