

Haskell Web Server in a 5MB Docker Image - lubomir
https://www.fpcomplete.com/blog/2015/05/haskell-web-server-in-5mb

======
cies
I was looking into some of this myself already; really helpful article and
amazing results. Another interesting approach is to compile Haskell with
HaLVM[1] in to a unikernel that can run on a Xen hypervisor. But this is a
non-posix environment on which Haskell's "network" package does not compile.
No "network" means that it is currently impossible[2] for WAI (Haskell's
standard interface between web servers and applications), but also db
libraries, to run in such an environment.

With going unikernel with Haskell still being a little steep (but definitely
on my wish list), then the next-best would be a mini VM/container image. And
5MB sure is mini!

Once again, thanks FPComplete!

1: [https://github.com/GaloisInc/HaLVM](https://github.com/GaloisInc/HaLVM)

2:
[https://github.com/GaloisInc/HaLVM/issues/43](https://github.com/GaloisInc/HaLVM/issues/43)

~~~
tel
OCaml's Mirage unikernel seems to have a lot of steam these days.

~~~
cies
Yeah it's a very complete project. And we saw "Look Ma No OS"[1] today on HN
about Erlang/Elixir-on-Xen with the LING unikernel. But it is Haskell that I'm
personally all hyped up about lately; and OS-less-ness is to me merely a
potential secondary advantage of going back to "compiled" (I come from
Ruby/Python before that Java before that C++).

My main reason for going with Haskell is that I know the costs of bugs, and
feel that I get to old for fighting bugs on tight deadlines.

1: [http://slides.com/technolo-g/intro-to-unikernels-and-
erlang-...](http://slides.com/technolo-g/intro-to-unikernels-and-erlang-on-
xen-ling-demo)

~~~
tel
Well, I'd suggest that OCaml probably has similar bug fighting properties as
Haskell. It depends a lot on how much you enjoy writing module existence
proofs :)

If I had any genuine reason for a unikernel today I'd definitely go for
Mirage.

------
chanux
I was once fascinated by tiny docker images and wanted to have a tiny docker
image with a web server.

There was a go web server I dockerized and came under 5MB [1]. But the thttpd
image by larsks was an amazing 1MB [2].

[1]
[https://registry.hub.docker.com/u/chanux/muhttpd/](https://registry.hub.docker.com/u/chanux/muhttpd/)

[2]
[https://registry.hub.docker.com/u/larsks/thttpd/](https://registry.hub.docker.com/u/larsks/thttpd/)

------
joeyh
I use the same technique of bundling the necessary dynamic libraries and gconv
files for the git-annex standalone tarball distribution. I've observed users
untarring that onto arbitrary wacky NAS boxes and it just working, which is
pretty nice.

I later adapted that for use in propellor too, when it's deploying docker/etc
containers. This allows propellor to bootstrap itself to run inside an
arbitrary docker container.
[http://joeyh.name/blog/entry/propelling_containers/](http://joeyh.name/blog/entry/propelling_containers/)

Later, I used propellor's ability to bootstrap itself this way to let it copy
itself onto a VM and run there to replace its content with a clean reinstall
of Debian.
[http://joeyh.name/blog/entry/clean_OS_reinstalls_with_propel...](http://joeyh.name/blog/entry/clean_OS_reinstalls_with_propellor/)

------
thu
Oh I was following the same path and was mising a library or two. The result
is similar to Michael's scratch image:
[https://gist.github.com/noteed/4155ffad2b1d13ab17ee](https://gist.github.com/noteed/4155ffad2b1d13ab17ee)

The resulting image for "hello world" compressed with `xz` (default options)
is 1.5MB. And it runs in a chroot or with qemu too.

