How to shrink your Docker images.

Docker Images, everyone says smaller is better but how do you do this but still maintain functionality and debugging ability? Well, here is how I did it.

Preflight Resources:

Docker Multi-stage building: https://docs.docker.com/develop/develop-images/multistage-build/#name-your-build-stages

Google Distroless Images: https://github.com/GoogleCloudPlatform/distroless/blob/master/examples/nodejs/Dockerfile

Docker-Puppeteer-Jest (Headless Chrome + Jest testing image): https://hub.docker.com/r/davidjeddy/docker_puppeteer_jest/

What we need to do:

Here is where we start, a 800Mb+ size image just to run headless Chrome and Jest. Ouch.

So lets apply the multi-stage build paradigm and use the Google Distroless NodeJs Image:

Now we rebuild the image using the `build . -t davidjeddy/docker_puppeteer_jest` command and we end up with a ~ 400MB images. 50% Savings!

Now remove the old busted and bloated image `docker rmi davidjeddy/docker_puppeteer_jest`. 

Usage:

Run the image command as normal and observe the same expected output as before. Unfortunately for the example project herein more work is needed as the original image did not keep dependences within the app dir.

TL;DR:

After building your service image, make an addition step that plops it into a distroless base image. Boosh, easy win.

Run your End-to-End tests using headless Chrome; Docker_Puppeteer_Jest Docker Image is announced!

About a year ago myself and @ibotpeaces sat down for a couple hours to to put together a docker images with headless Chrome that we could use for End-to-End (user acceptance) testing. At the time the tooling of both Docker and Jest where not at a place at we could get a POC (proof of concept) functional give the constants of the process being a container service, easy integration into existing projects, and using a well adopted JavaScript testing framework.

Google Chrome
Google Chrome
Docker
Docker

 

 

 

 

 

Fast forward to March 2018 and not only has the containerization tooling but advanced significantly but also the headless Chrome control systems. As such I sat down once gain to look into this tool chain. I am happy to announce `Docker Puppeteer Jest‘ docker image. As the name suggests running the image will spin up a headless Chrome instance, controlled by Puppeteer that triggers Jest test suites. Outputting both terminal response and image captures if so instructed.

Checkout the image on the Docker Hub or the repo on GitHub. Let me know what you think or if you find it useful. I’d love to hear from you.