The loklak server is in a process of moving to Kubernetes. In order to do so, we needed to have different Docker images that suit these deployments. In this blog post, I will be discussing the process through which I optimised the size of Docker image for these deployments.
Initial Image
The image that I started with used Ubuntu as base. It installed all the components needed and then modified the configurations as required –
FROM ubuntu:latest # Env Vars ENV LANG=en_US.UTF-8 ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 ENV DEBIAN_FRONTEND noninteractive WORKDIR /loklak_server RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y git openjdk-8-jdk RUN git clone https://github.com/loklak/loklak_server.git /loklak_server RUN git checkout development RUN ./gradlew build -x test -x checkstyleTest -x checkstyleMain -x jacocoTestReport RUN sed -i.bak 's/^\(port.http=\).*/\180/' conf/config.properties ... # More configurations RUN echo "while true; do sleep 10;done" >> bin/start.sh # Start CMD ["bin/start.sh", "-Idn"]
The size of images built using this Dockerfile was quite huge –
REPOSITORY TAG IMAGE ID CREATED SIZE
loklak_server latest a92f506b360d About a minute ago 1.114 GB
ubuntu latest ccc7a11d65b1 3 days ago 120.1 MB
But since this size is not acceptable, we needed to reduce it.
Moving to Apline
Alpine Linux is an extremely lightweight Linux distro, built mainly for the container environment. Its size is so tiny that it hardly puts any impact on the overall size of images. So, I replaced Ubuntu with Alpine –
FROM alpine:latest ... RUN apk update RUN apk add git openjdk8 bash ...
And now we had much smaller images –
REPOSITORY TAG IMAGE ID CREATED SIZE
loklak_server latest 54b507ee9187 17 seconds ago 668.8 MB
alpine latest 7328f6f8b418 6 weeks ago 3.966 MB
As we can see that due to no caching and small size of Alpine, the image size is reduced to almost half the original.
Reducing Content Size
There are many things in a project which are no longer needed while running the project, like the .git folder (which is huge in case of loklak) –
$ du -sh loklak_server/.git 236M loklak_server/.git
We can remove such files from the Docker image and save a lot of space –
rm -rf .[^.] .??*
Optimizing Number of Layers
The number of layers also affect the size of the image. More the number of layers, more will be the size of image. In the Dockerfile, we can club together the RUN commands for lower number of images.
RUN apk update && apk add openjdk8 git bash && \ git clone https://github.com/loklak/loklak_server.git /loklak_server && \ ...
After this, the effective size is again reduced by a major factor –
REPOSITORY TAG IMAGE ID CREATED SIZE
loklak_server latest 54b507ee9187 17 seconds ago 422.3 MB
alpine latest 7328f6f8b418 6 weeks ago 3.966 MB
Conclusion
In this blog post, I discussed the process of optimising the size of Dockerfile for Kubernetes deployments of loklak server. The size was reduced to 426 MB from 1.234 GB and this provided much faster push/pull time for Docker images, and therefore, faster updates for Kubernetes deployments.
Resources
- Docker Tutorial Series : Writing a Dockerfile – https://rominirani.com/docker-tutorial-series-writing-a-dockerfile-ce5746617cd.
- Deploying loklak Server on Kubernetes with External Elasticsearch – https://blog.fossasia.org/deploying-loklak-server-on-kubernetes-with-external-elasticsearch/
- Dockerfile Best Practices – https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/.
- How to Optimize Your Dockerfile – https://blog.tutum.co/2014/10/22/how-to-optimize-your-dockerfile/.