Experimenting with Docker Multi Stage Builds to see image size impact.
I ran a couple of tests modifying the .dockerignore and Dockerfile using a simple Node ExpressJS
app.
First I ran npm init -y, then npm i express and npm i -D eslint prettier. After installing all
dependencies I created a src dir with a single file called app.js with the following contents:
'uses strict';
const express = require('express');
const app = express();
app.use('/', function(req, res, next) {
res.json({
status: 'ok'
});
});
app.listen(8888);As well as a .dockerignore, Dockerfile and basic README.md. This gives the following structure:
node_modules
src/
app.js
.dockerignore
Dockerfile
package-lock.json
package.json
README.md
First I wanted to see how the Docker Build Context is affected. Therefore I build an image with an
empty .dockerignore using node:9.6 as a base image, without multi stage build.
Navigate to /test-1 and run:
docker build -t msb-node-1 .
| DOCKER ARTIFACT | SIZE |
|---|---|
| Build Context | 23.48 MB |
| Image | 680 MB |
Now we only send the package files and source code using node:9.6 as a base image, without multi
stage build.
Navigate to /test-2 and run:
docker build -t msb-node-2 .
| DOCKER ARTIFACT | SIZE |
|---|---|
| Build Context | 57.86 kB |
| Image | 680 MB |
Now we only send the package files and source code using node:9.6 as base images, with multi
stage build.
Navigate to /test-3 and run:
docker build -t msb-node-3 .
| DOCKER ARTIFACT | SIZE |
|---|---|
| Build Context | 57.86 kB |
| Image | 678 MB |
Now we only send the package files and source code using node:9.6-alpine as base images, with multi
stage build.
Navigate to /test-4 and run:
docker build -t msb-node-4 .
| DOCKER ARTIFACT | SIZE |
|---|---|
| Build Context | 57.86 kB |
| Image | 69.7 MB |
😎
The build context size is printed when running the docker build command, for example:
And the image size is printed when running docker images, for example:

