Learning NodeJS & MongoDB Docker compose - node.js

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.

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

create-react-app react-scripts start - ajv-errors: NOT SUPPORTED: option jsonPointers. Deprecated jsPropertySyntax can be used instead

Seeing this error after coming back to a project after a few weeks. Changed/updated nothing, everything was working fine last time I had this laptop open. The following error happens in a container when I'm running docker-compose up.
yarn run v1.22.17
client | $ react-scripts start
client | NOT SUPPORTED: option jsonPointers. Deprecated jsPropertySyntax can be used instead.
client | /app/node_modules/ajv-errors/index.js:4
client | if (!ajv._opts.allErrors) throw new Error('ajv-errors: Ajv option allErrors must be true');
client | ^
client |
client | TypeError: Cannot read properties of undefined (reading 'allErrors')
client | at module.exports (/app/node_modules/ajv-errors/index.js:4:18)
client | at Object.<anonymous> (/app/node_modules/webpack-dev-server/node_modules/schema-utils/src/validateOptions.js:22:1)
client | at Module._compile (node:internal/modules/cjs/loader:1103:14)
client | at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
client | at Module.load (node:internal/modules/cjs/loader:981:32)
client | at Function.Module._load (node:internal/modules/cjs/loader:822:12)
client | at Module.require (node:internal/modules/cjs/loader:1005:19)
client | at require (node:internal/modules/cjs/helpers:102:18)
client | at Object.<anonymous> (/app/node_modules/webpack-dev-server/node_modules/schema-utils/src/index.js:7:25)
client | at Module._compile (node:internal/modules/cjs/loader:1103:14)
client | error Command failed with exit code 1.
client | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
client exited with code 1
So posting my own question I changed how I was looking at the problem.
I came across this question/answer AJV and ajv-formats latest must be broken in React
I found the answer from #Tsar Bomba about installing
npm install ajv#7.2.3 ajv-errors#2.0.1 ajv-formats#2.1.1 --save
Worked for me and I was able to serve my project again
The following also worked for me.
npm install ajv#7.2.3 ajv-errors#2.0.1 ajv-formats#2.1.1 --save

Error: #prisma/client did not initialize yet. Please run "prisma generate"

I am having a problem with my nodeJS back-end. I want to create a docker compose environment but I keep getting this error when I try to start my Prisma NodeJS app. I already tried lots of things and I can't find any usable solutions on Google. The application works without docker.
Docker compose file:
endbit-express:
container_name: endbit-express
build: ./endbit-express
volumes:
- ./endbit-express:/app
- /app/node_modules
ports:
- 8080:8080
depends_on:
- mysql
environment:
- DATABASE_URL=mysql://root:root#localhost:3306/endbit
networks:
- endbit
mysql:
container_name: endbit-mysql
image: mysql:8.0.28
restart: always
ports:
- 6033:3306
environment:
- MYSQL_DATABASE=endbit
- MYSQL_ROOT_PASSWORD=root
volumes:
- dbdata:/var/lib/mysql
networks:
- endbit
Docker file:
FROM node:17.4.0
WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma
RUN npm install
COPY . .
RUN prisma generate
EXPOSE 8080
CMD ["npm", "start"]
Error:
endbit-express | > express#0.0.0 start
endbit-express | > node ./bin/www
endbit-express |
endbit-express | /app/node_modules/.prisma/client/index.js:3
endbit-express | throw new Error(
endbit-express | ^
endbit-express |
endbit-express | Error: #prisma/client did not initialize yet. Please run "prisma generate" and try to import it again.
endbit-express | In case this error is unexpected for you, please report it in https://github.com/prisma/prisma/issues
endbit-express | at new PrismaClient (/app/node_modules/.prisma/client/index.js:3:11)
endbit-express | at Object.<anonymous> (/app/config/passport.js:7:16)
endbit-express | at Module._compile (node:internal/modules/cjs/loader:1097:14)
endbit-express | at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
endbit-express | at Module.load (node:internal/modules/cjs/loader:975:32)
endbit-express | at Function.Module._load (node:internal/modules/cjs/loader:822:12)
endbit-express | at Module.require (node:internal/modules/cjs/loader:999:19)
endbit-express | at require (node:internal/modules/cjs/helpers:102:18)
endbit-express | at Object.<anonymous> (/app/app.js:7:1)
endbit-express | at Module._compile (node:internal/modules/cjs/loader:1097:14)
endbit-express |
endbit-express | Node.js v17.4.0
add RUN npm i -g prisma before RUN prisma generate it should work
Eventually I found the answer myself: I am using a docker compose file, and Docker doesn't recognize the localhost:3306 URL. In docker compose you need to link the containers by their name, so I changed the backend component environment with this (host = docker service name):
environment:
- DB_HOST=mysql
- DB_USER=root
- DB_PASSWORD=root
- DB_NAME=endbit-express
- DB_PORT=3306

Strapi develop script not working with PM2

I am trying to run Strapi in development mode with pm2 by using this command:
pm2 start npm --name myprojectname -- run develop
Unfortunately, I get the following error
0|edtech-a | SyntaxError: Unexpected token ':'
0|edtech-a | at wrapSafe (internal/modules/cjs/loader.js:979:16)
0|edtech-a | at Module._compile (internal/modules/cjs/loader.js:1027:27)
0|edtech-a | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
0|edtech-a | at Module.load (internal/modules/cjs/loader.js:928:32)
0|edtech-a | at Function.Module._load (internal/modules/cjs/loader.js:769:14)
0|edtech-a | at Object.<anonymous> (C:\Users\dimit\AppData\Roaming\npm\node_modules\pm2\lib\ProcessContainerFork.js:33:23)
0|edtech-a | at Module._compile (internal/modules/cjs/loader.js:1063:30)
0|edtech-a | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
0|edtech-a | at Module.load (internal/modules/cjs/loader.js:928:32)
0|edtech-a | at Function.Module._load (internal/modules/cjs/loader.js:769:14)
PM2 version is 4.5.1
NodeJS version is 14.15.4
NPM version is 6.13.2
Strapi version is 3.1.0-alpha.5
I get the same error when I try to run Strapi in development mode through an ecosystem.config.json file as well.
Has somebody faced this issue, if yes, how can I solve it?
Yeah, I encountered some problems myself and decided to go for a workaround:
Create a script with the commands you would type normally:
touch strapi.sh
Type in your desired commands:
nano strapi.sh
cd my-strapi-project
npm run develop
Close and save (Crtl+x then type "y" and press enter).
Now just start that file with pm2
pm2 start strapi.sh
Check if everything works fine
pm2 logs
Thats it.
Can you try with this:
pm2 start npm --name myprojectname --interpreter bash -- run develop
UPDATED
for yarn
pm2 start yarn --name myprojectname --interpreter bash -- run develop

"Failed to load gRPC binary module" error when running a Sails.js application inside a Docker container

I have a local Docker developer environment to build a Sails.js application. This is what my Dockerfile looks like:
FROM node:8.12
LABEL Name=us.gcr.io/my-project/my-app Version=1.0.0
# Container configuration
RUN npm install -g sails#1.0.2 grunt#1.0.3 nodemon#1.18.4
WORKDIR /usr/src/app
COPY ./server/package.json ./package.json
RUN npm install
VOLUME /usr/src/app
EXPOSE 1337
This is what my docker-compose.yml file looks like:
version: '3.4'
services:
server:
image: us.gcr.io/my-project/my-app:latest
build: .
environment:
NODE_ENV: development
IS_DEV_MACHINE: "yes"
ports:
- 1338:1337 # HOST_PORT is 1339 to avoid conflicts with other Sails.js apps running on host
volumes:
- ./server:/usr/src/app
entrypoint: nodemon
mongodb:
image: mongo:4
ports:
- 27018:27017 # HOST_PORT is 27018 to avoid conflicts with other MongoDB databases running on host
volumes:
- ../database:/data/db
Normally, everything works fine however, I recently imported and initialised the #google-cloud/logging NPM package in my application and now, when I run docker-compose up, I get the following error:
server_1 | error: Bootstrap encountered an error: (see below)
server_1 | error: Failed to lift app: { Error: Failed to load gRPC binary module because it was not installed for the current system
server_1 | Expected directory: node-v57-linux-x64-musl
server_1 | Found: [node-v57-darwin-x64-unknown]
server_1 | This problem can often be fixed by running "npm rebuild" on the current system
server_1 | Original error: Cannot find module '/usr/src/app/node_modules/grpc/src/node/extension_binary/node-v57-linux-x64-musl/grpc_node.node'
server_1 | at Object.<anonymous> (/usr/src/app/node_modules/grpc/src/grpc_extension.js:53:17)
server_1 | at Module._compile (module.js:653:30)
server_1 | at Object.Module._extensions..js (module.js:664:10)
server_1 | at Module.load (module.js:566:32)
server_1 | at tryModuleLoad (module.js:506:12)
server_1 | at Function.Module._load (module.js:498:3)
server_1 | at Module.require (module.js:597:17)
server_1 | at require (internal/module.js:11:18)
server_1 | at Object.<anonymous> (/usr/src/app/node_modules/grpc/src/client_interceptors.js:145:12)
server_1 | at Module._compile (module.js:653:30)
server_1 | at Object.Module._extensions..js (module.js:664:10)
server_1 | at Module.load (module.js:566:32)
server_1 | at tryModuleLoad (module.js:506:12)
server_1 | at Function.Module._load (module.js:498:3)
server_1 | at Module.require (module.js:597:17)
server_1 | at require (internal/module.js:11:18) code: 'MODULE_NOT_FOUND' }
mongodb_1 | 2018-10-09T09:27:52.521+0000 I NETWORK [conn4] end connection 172.19.0.2:48730 (0 connections now open)
In the error above, "Bootstrap" is the bootstrap.js file in my Sails.js project that initialises #google-cloud/logging. This is how I am initialising the logger in bootstrap.js:
// Globally required packages
const { Logging } = require('#google-cloud/logging');
const logging = new Logging({ projectId: 'my-project' });
const logger = logging.log('test');
I just can't seem to figure out why this error is occurring. I even tried changing my base Docker image to the official Google App Engine Docker image (gcr.io/google-appengine/nodejs) and that did not help either. i can't find any solutions to this problem anywhere. Appreciate any help.
By any chance did you do a npm install on your local Mac (darwin) environment when it should have been done in the container (linux)? The grpc binary is for the wrong OS thus the error. This often happens with a local Mac running a linux Docker container.
Expected directory: node-v57-linux-x64-musl
Found: [node-v57-darwin-x64-unknown]
The solution would be to rm -fr node_modules and do npm install in the container.
Rebuild the app by the following command.
npm rebuild --target=8.1.0 --target_platform=linux --target_arch=x64 --target_libc=musl
It looks like the project is having difficulty finding dependencies such as the gRPC binary module (repaired with npm install grpc) or perhaps where they are currently located - more info here

Can node.js ignore a local node_modules directory and only use global modules?

Can node.js be configured to only use a globally-installed modules and ignore a local node_modules directory?
For our node.js app (currently node.js 8.10.0), we build a Docker image where the required modules are installed globally, in a /node_modules folder, with the environment set to NODE_PATH=/node_modules. This works for production deployment.
For local development, we run the same Docker image, but mount the local development files at /app. This allows any locally changed files to be used by the image.
This works, until a developer runs npm install on their host system, and creates a node_modules directory. This is mounted at /app/node_modules. node examines this folder on startup, and starts complaining about missing binaries:
kumascript_1 | ## There is an issue with `node-fibers` ##
kumascript_1 | `/app/node_modules/fibers/bin/linux-x64-57/fibers.node` is missing.
kumascript_1 |
kumascript_1 | Try running this to fix the issue: /usr/local/bin/node /app/node_modules/fibers/build
kumascript_1 | /app/node_modules/fibers/fibers.js:20
kumascript_1 | throw new Error('Missing binary. See message above.');
kumascript_1 | ^
kumascript_1 |
kumascript_1 | Error: Missing binary. See message above.
kumascript_1 | at Object.<anonymous> (/app/node_modules/fibers/fibers.js:20:8)
kumascript_1 | at Module._compile (module.js:652:30)
kumascript_1 | at Object.Module._extensions..js (module.js:663:10)
kumascript_1 | at Module.load (module.js:565:32)
kumascript_1 | at tryModuleLoad (module.js:505:12)
kumascript_1 | at Function.Module._load (module.js:497:3)
kumascript_1 | at Module.require (module.js:596:17)
kumascript_1 | at require (internal/module.js:11:18)
kumascript_1 | at Object.<anonymous> (/app/lib/kumascript/templates.js:11:13)
kumascript_1 | at Module._compile (module.js:652:30)
If there was a way to tell node to ignore /app/node_modules, then a developer can do what they want with npm install on the host system, and the Docker container would continue running as expected.

Resources