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: