'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 includenode_modules
, Dockerfile would have overwrittennode_modules
anyway? So why bother to putnode_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
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...
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 |