Learning NodeJS & MongoDB Docker compose

Viewed 593

I have a NodeJS project that uses MongoDB. I would like to run this service in a Docker container, but despite the many examples I have based my learning from, this will not work.

Here is my /heimdall_jwt/Dockerfile:

FROM node:9-alpine
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
RUN npm install pm2 -g
COPY . /usr/src/app
EXPOSE 3000
CMD ["pm2-docker", "start", "process.json"]

And here is my /heimdall_jwt/docker-compose.yml

version: '2'
    # Define the services/containers to be run
services:
    myapp: #name of your service
        build: ./ # specify the directory of the Dockerfile
        ports:
          - "3000:3000" #specify ports forwarding
        links:
          - database # link this service to the database service
        volumes:
          - .:/usr/src/app
        depends_on:
          - database    
    database: # name of the service
       image: mongo # specify image to build container from

I tried running via: $docker-compose up --build which results in the mongo being build and starting. Here is the condensed output:

Building myapp
Step 1/8 : FROM node:9-alpine
...
Step 4/8 : RUN npm install
 ---> Using cache
 ---> befb91b1324c
...
Removing intermediate container 945eb0ad40d5
Successfully built b500f7ec9b89
Successfully tagged heimdalljwt_myapp:latest
Creating heimdalljwt_database_1 ...
Creating heimdalljwt_database_1 ... done
Creating heimdalljwt_myapp_1 ...
Creating heimdalljwt_myapp_1 ... done
Attaching to heimdalljwt_database_1, heimdalljwt_myapp_1
database_1  | 2017-11-25T21:15:39.001+0000 I INDEX    [initandlisten]    building index using bulk method; build may temporarily use up to 500 megabytes of RAM
database_1  | 2017-11-25T21:15:39.002+0000 I INDEX    [initandlisten] build index done.  scanned 0 total records. 0 secs
database_1  | 2017-11-25T21:15:39.003+0000 I COMMAND  [initandlisten] setting featureCompatibilityVersion to 3.4
database_1  | 2017-11-25T21:15:39.005+0000 I NETWORK  [thread1] waiting for connections on port 27017
myapp_1     | 0|heimdall | Error: Cannot find module 'bcryptjs'
myapp_1     | 0|heimdall |     at Function.Module._resolveFilename (module.js:542:15)
myapp_1     | 0|heimdall |     at Function.Module._load (module.js:472:25)
myapp_1     | 0|heimdall |     at Module.require (module.js:585:17)
myapp_1     | 0|heimdall |     at require (internal/module.js:11:18)
myapp_1     | 0|heimdall |     at Object.<anonymous> (/usr/src/app/user/User.js:2:14)
myapp_1     | 0|heimdall |     at Module._compile (module.js:641:30)
myapp_1     | 0|heimdall |     at Object.Module._extensions..js (module.js:652:10)
myapp_1     | 0|heimdall |     at Module.load (module.js:560:32)
myapp_1     | 0|heimdall |     at tryModuleLoad (module.js:503:12)
myapp_1     | 0|heimdall |     at Function.Module._load (module.js:495:3)
myapp_1     | 0|heimdall |     at Module.require (module.js:585:17)
myapp_1     | 0|heimdall |     at require (internal/module.js:11:18)
myapp_1     | 0|heimdall |     at Object.<anonymous> (/usr/src/app/user/UserController.js:12:12)
myapp_1     | 0|heimdall |     at Module._compile (module.js:641:30)
myapp_1     | 0|heimdall |     at Object.Module._extensions..js (module.js:652:10)
myapp_1     | 0|heimdall |     at Module.load (module.js:560:32)
myapp_1     | PM2        | App name:heimdall_app id:0 disconnected

I am uncertain what is going on here, but I am guessing that the dependencies are either not being installed, or not being copied into the working directory. How

UPDATED Modified from original posting as I still am struggling to get this to work.

1 Answers

You should copy files after npm install. Right now you are installing dependencies and then copying over everything, so you are effectively canceling that install and you don't have dependencies.

In your Dockerfile you have:

...
RUN npm install
RUN npm install pm2 -g
COPY . /usr/src/app
...

It should be:

...
COPY . /usr/src/app
RUN npm install
RUN npm install pm2 -g
...
Related