I've created a Node-application with MongoDB that runs in Docker. It worked fine until I included node.bcrypt.js. This makes Node crash with node-gyp
and bcrypt
.
The app runs fine locally and on Heroku.
I tried to install a few suggested packages that I found online, that were known to be needed based on error messages. This is why I've added a few extra dependencies, see the node-gyp
-related line in the dockerfile below.
Now it's gotten where I cannot find any more suggestions, but it still doens't work. I feel it's weird that it works both locally and on Heorku, but not on Docker, and therefore that it's something I'm missing.
Thanks in advance.
Error:
> [email protected] start /server
> node index.js
COPY Release/bcrypt_lib.node
make: Leaving directory `/server/node_modules/bcrypt/build'
module.js:338
throw err;
^
Error: Cannot find module './lib/topologies/server'
at Function.Module._resolveFilename (module.js:336:15)
at Function.Module._load (module.js:278:25)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/server/node_modules/mongodb/node_modules/mongodb-core/index.js:3:13)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
npm ERR! Linux 3.13.0-58-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "start"
npm ERR! node v0.12.7
npm ERR! npm v2.11.3
npm ERR! code ELIFECYCLE
npm ERR! [email protected] start: `node index.js`
npm ERR! Exit status 1
This is after I added a few installations to my Dockerfile, see the line after node-gyp
. Dockerfile:
# Base Docker-image on Ubuntu
FROM ubuntu:latest
#install mongodb
#install git, curl, python and mongo
# node-gyp
RUN apt-get install -y build-essential make automake gcc g++ cpp libkrb5-dev libc6-dev man-db autoconf pkg-config
# Create the MongoDB data directory
RUN mkdir -p /data/db
# mongodb setup
# Install NodeJS
RUN curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -
RUN apt-get update && apt-get install -y nodejs
RUN npm install -g node-gyp
# Git-clone project
# expose ports
# Install dependencies and start server and database
CMD cd /server && sh start.sh
The starth.sh
-script simply installs dependencies and starts both MongoDB and server.
EDIT: The repo tells me to check out the node-gyp dependencies, but I feel that's been covered by the Dockerfile shown above.
It is crashing because you are missing some essentials tool for the compilation purposes of Bcrypt. Bcrypt needs to be compiled each time you do npm install
to crate a version for the operating system that is running on since it is written in C.
For those that would like to use the original Bcrypt, you can run the following docker command:
docker run -t -i --rm -v $(pwd):/app -w /app node:slim sh -c 'apt-get update && apt-get install -y build-essential && apt-get install -y python && npm install'
Before we do npm install
we need to:
build-essential
package.Once we have all this stuff, we can run npm install
successfully :)
Hope this helps.
I solved this by simply changing the bcrypt
-library. This one was created based on a similar problem, and provides the same API. The only difference from the library mentioned in my question is:
bcrypt.hash(password, function(err, hash) {
if(!err) callback(hash);
});
While in the one linked in this answer:
bcrypt.hash(password, null, null, function(err, hash) { // Addd nulls
if(!err) callback(hash);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With