Getting npm packages to be installed with docker-compose
If you’re trying to deploy your node app into a docker container and you’re also using docker-compose, here’s something to watch out for.
If you are running npm install
on your Dockerfile
, you might want to
make sure that you mount /node_modules as a data volume in your
docker-compose.
For eg. your Dockerfile
might look something like this:
# Dockerfile
FROM node:5.5.0
ADD ./ /node_app
WORKDIR /node_app
RUN npm install
Normal stuff. Mount your app from the host to your container and install the npm dependencies. Nothing should go wrong right?
Unfortunately, if you also use docker-compose to bring up other services together with your node app, your compose might look something like:
#docker-compose.yml
node:
build: .
command: node /node_app/dist/index.js
links:
- db
volumes:
- ./:/node_app
db:
image: rethinkdb
If you run docker-compose up
you might encounter issues of missing modules
even though npm install ran successfully and you’re sure every dependency is
installed.
This is because the mounting of the volume by docker-compose would supercede the node_modules that was installed in your built image. This causes the volume to overwrite ontop of the built image.
In order to overcome this, you’ll need to make sure that you mount the directory as a data volume.
In your docker-compose.yml
, just change:
# docker-compose.yml
node:
...
volumes:
- ./:/node_app
- /node_app/node_modules
Now if you run your docker-compose up
, you should be able to see your node
application running successfully now.
References: