'Confusion with node_modules being ignored by .dockerignore

Thought I'd just wanted to share this. So I am testing creation of a docker image/container with a nodejs app usiung Dockerfile. Everything went smoothly, until I tried to add the .dockerignore file, where I listed the following files in it, expecting that they won't get copied into the docker image:

node_modules 
dockerignore 
Dockerfile

And here is my Dockerfile:

FROM node:latest
WORKDIR /app
ADD . .
RUN npm install
CMD node index.js

So I trashed and rebuilt my image with the existing Dockerfile and the new .dockerignore file. After the creation, I ran docker run -it --entrypoint sh <image name> to check if those files/folders do not appear anymore.

Dockerfile and .dockerignore are gone. But node_modules folder is still there.

Took me a while to "realize" that MAYBE the node_modules folder in the image is created by the Dockerfile's npm install step, not the folder copied from the host anyway.

Am I right?



Solution 1:[1]

So I got the answer based on tkausl and David Maze's comments (thanks guys!) .

The node_modules inside the image is generated from the Dockerfile 'npm install' step.

And as for the question:

if .dockerignore does not include node_modules, Dockerfile would have overwritten node_modules anyway? So why bother to put node_modules inside the .dockerignore file?

the comment I received was that if I left out the node_modules from the .dockerignore file, then the docker build process would have slowed down due to unnecessary copying of the node_modules, PLUS the image would have been larger.

Therefore, the prudent thing is to keep node_modules inside .dockerignore file to achieve more efficiency in the docker build process.

UPDATE: I did try to run the scenario with the node_modules removed from .dockerignore file, and the image is showing 940MB, whereas creating the image with node_modules inside the .dockerignore file - though the process may be more efficient - the output image is 942MB (2MB larger).

Solution 2:[2]

Consider docker as a entire new box, where everything will be installed and given commands to run specific tasks

In this case, try two things

  1. Create .dockerignore file and ignore all files which you think you don't want to include or let docker handles from itself.

    .git

    */node_modules

    ####### other files...

  2. And in Dockerfile just copy package.json as docker it use for deployment, so it makes sense that only package.json file will get change. So try adding COPY package*.json ./ in Dockerfile.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Aamer