- By Javier Martínez
- ·
- Posted 10 Aug 2021
Functional patterns
Welcome pythonistas! In our last video session on design patterns we focused exclusively on patterns for the object oriented paradigm (OOP). To some..
I have recently discovered Docker's new multi-stage build feature. This has been a great help in answering my question of how to reduce the size of my haskell images for deploying, as the main haskell image on Docker Hub is over 1GB before you start adding things. This also means you don't have to maintain two Dockerfiles.
With multi stage builds we can use the haskell
docker image to build our distributable executable, then copy this to a smaller image (in this case phusion/baseimage
).
Here's an example Dockerfile for a project called haskell-example
:
FROM haskell as build-env
WORKDIR /opt/server
RUN cabal update
COPY haskell-example.cabal .
RUN cabal install --only-dependencies -j4
ADD . .
RUN cabal install
FROM phusion/baseimage
WORKDIR /opt/server
COPY --from=build-env /opt/server/dist .
CMD ./build/haskell-example/haskell-example
Before, using just the haskell image: 1.87GB.
After, using multi-stage with baseimage: 249MB.
There's just one problem with this method - the intermediate images are all marked as dangling. This means that if you do a docker system prune
and rebuild, you will have install all your dependencies again, which takes a lot of time in the haskell world.
The workaround for this is to build an image using the build-env
stage. This is done by specifying the target when building.
docker build -t haskell-example-dev --target build-env .
This keeps the image in the cache so it won't be prune
'd.
So we've shrunk our deployable image using phusion/baseimage
, can we go further? The next step would be to use something like alpine as the production image, a mere 4.14MB. That's what I'll talk about next time :)
Welcome pythonistas! In our last video session on design patterns we focused exclusively on patterns for the object oriented paradigm (OOP). To some..
Solving a simple problem in Elixir In this article, I am going to solve the Word Count problem from Exercism in Elixir. I'll start with a form that..
Crafting web apps using finite state machines - Part 1 Code on Gitlab
Join our newsletter for expert tips and inspirational case studies
Join our newsletter for expert tips and inspirational case studies