I have just started to learn Docker. I have a nodeJs web application and built 2 images of it using 2 different Dockerfile. The 2 images are really different in size. Can someone tell me why they are really different in size even though they use the same alpine, node, and npm version, and which one is the recommended way to build a nodeJS application image?
First Dockerfile which created a 91.92MB image:
FROM alpine
RUN apk add --update nodejs npm curl
COPY . /src
WORKDIR /src
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
Second Dockerfile which created a 259.57MB image:
FROM node:19-alpine3.16
RUN apk add --update npm curl
COPY . /src
WORKDIR /src
RUN npm install
CMD [ "node", "./app.js" ]
2
Answers
The base image you start from hugely affects your final image size – assuming you are adding the same stuff to each base image. In your case, you are comparing a base alpine image (5.5mb) to a base node image (174mb). The base alpine image will have very little stuff in it while the node image – while based on alpine – has at least got node in it but presumably lots of extra stuff too. Whether you do or do not need that extra stuff is not for me to say.
You can examine the Dockerfile used to build any of these public images if you wish to see exactly what was added. You can also use tools like dive to examine a local image layers.
If it meets your technical and non-technical needs, using the prebuilt
node
image is probably simpler and easier to update, and I’d generally recomment using it.The
node
image already includesnpm
; you do not have toapk add
it. Moreover, theDockerfile
doesn’t useapk
to install Node, but instead installs it either from a tar file or from source. So theapk add npm
call winds up installing an entire second copy of Node that you don’t need; that’s probably the largest difference in the two image sizes.