0

I have this Dockerfile for my API project using Node.js - Express.js

api.dockerfile

FROM node:8.9.4

COPY package.json ./

RUN npm set progress=false && npm config set depth 0 && npm cache clean --force

## Storing node modules on a separate layer will prevent unnecessary npm installs at each build
RUN npm i && npm install nodemon --save \
    && npm install pm2 -g \
    && npm install -g sequelize-cli \
    && mkdir /ng-app \
    && chown -R node:node /ng-app \
    && cp -R ./node_modules ./ng-app

USER node

WORKDIR /ng-app

COPY . .
RUN mv docker.env .env

# Migration
RUN sequelize db:migrate
RUN sequelize db:seed:all

CMD ["pm2-runtime", "index.js"]

docker-compose.yaml

version: "2"
services:
  iproject-api:
    build:
      context: ./api
      dockerfile: api.dockerfile
    image: 'iproject-api'
    ports:
      - '3002:3002'
  iproject-web:
    build:
      context: ./web
      dockerfile: web.dockerfile
    image: 'iproject-web:latest'
    ports:
      - '8080:8080'
    links:
      - iproject-api

This is the result, I got

Building iproject-api
Step 1/11 : FROM node:9.3.0
 ---> 3d1823068e39
Step 2/11 : COPY package.json ./
 ---> 793cf321a2ce
Removing intermediate container 42ec19ebe5c0
Step 3/11 : RUN npm set progress=false && npm config set depth 0 && npm cache clean --force
 ---> Running in 86f16967a881
npm WARN using --force I sure hope you know what you are doing.
 ---> e70409fdab5a
Removing intermediate container 86f16967a881
Step 4/11 : RUN npm i && npm install nodemon --save     && npm install pm2 -g     && npm install -g sequelize-cli     && mkdir /ng-app     && chown -R node:node /ng-app     && cp -R ./node_modules ./ng-app
 ---> Running in 04532538ea1c

> [email protected] install /node_modules/bcrypt
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.3/bcrypt_lib-v1.0.3-node-v59-linux-x64.tar.gz 
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v59 ABI) (falling back to source compile with node-gyp) 
make: Entering directory '/node_modules/bcrypt/build'
  CXX(target) Release/obj.target/bcrypt_lib/src/blowfish.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt_node.o
In file included from ../../nan/nan.h:192:0,
                 from ../src/bcrypt_node.cc:1:
../../nan/nan_maybe_43_inl.h: In function 'Nan::Maybe<bool> Nan::ForceSet(v8::Local<v8::Object>, v8::Local<v8::Value>, v8::Local<v8::Value>, v8::PropertyAttribute)':
../../nan/nan_maybe_43_inl.h:112:73: warning: 'v8::Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>, v8::PropertyAttribute)' is deprecated (declared at /root/.node-gyp/9.3.0/include/node/v8.h:3114): Use CreateDataProperty / DefineOwnProperty [-Wdeprecated-declarations]
   return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs);
                                                                         ^
  SOLINK_MODULE(target) Release/obj.target/bcrypt_lib.node
  COPY Release/bcrypt_lib.node
  COPY /node_modules/bcrypt/lib/binding/bcrypt_lib.node
  TOUCH Release/obj.target/action_after_build.stamp
make: Leaving directory '/node_modules/bcrypt/build'
npm notice created a lockfile as package-lock.json. You should commit this file.
added 259 packages in 10.214s

> [email protected] postinstall /node_modules/nodemon
> node -e "console.log('\u001b[32mLove nodemon? You can now support the project via the open collective:\u001b[22m\u001b[39m\n > \u001b[96m\u001b[1mhttps://opencollective.com/nodemon/donate\u001b[0m\n')" || exit 0

Love nodemon? You can now support the project via the open collective:
 > https://opencollective.com/nodemon/donate

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ [email protected]
added 246 packages in 6.452s
/usr/local/bin/pm2 -> /usr/local/lib/node_modules/pm2/bin/pm2
/usr/local/bin/pm2-docker -> /usr/local/lib/node_modules/pm2/bin/pm2-docker
/usr/local/bin/pm2-dev -> /usr/local/lib/node_modules/pm2/bin/pm2-dev
/usr/local/bin/pm2-runtime -> /usr/local/lib/node_modules/pm2/bin/pm2-runtime
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/pm2/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ [email protected]
added 251 packages in 6.019s
/usr/local/bin/sequelize -> /usr/local/lib/node_modules/sequelize-cli/lib/sequelize
+ [email protected]
added 105 packages in 3.671s
 ---> 4b47d47d16d4
Removing intermediate container 04532538ea1c
Step 5/11 : USER node
 ---> Running in 97ec9500d986
 ---> 4b9e99e1facc
Removing intermediate container 97ec9500d986
Step 6/11 : WORKDIR /ng-app
 ---> 33f8184f151a
Removing intermediate container f49ca4cea9c3
Step 7/11 : COPY . .
 ---> 1243df32a81e
Removing intermediate container 38c9727ec50b
Step 8/11 : RUN mv docker.env .env
 ---> Running in 8e168cdde98d
 ---> bb8d34bb1c7f
Removing intermediate container 8e168cdde98d
Step 9/11 : RUN sequelize db:migrate
 ---> Running in f97010013425

Sequelize CLI [Node: 9.3.0, CLI: 3.2.0, ORM: 4.31.0]

WARNING: This version of Sequelize CLI is not fully compatible with Sequelize v4. https://github.com/sequelize/cli#sequelize-support

Loaded configuration file "pg/config/config.js".
Using environment "development".
Thu, 11 Jan 2018 03:54:44 GMT sequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security, read more at http://docs.sequelizejs.com/manual/tutorial/querying.html#operators at ../node_modules/sequelize/lib/sequelize.js:237:13
No migrations were executed, database schema was already up to date.
 ---> 130ed294e658
Removing intermediate container f97010013425
Step 10/11 : RUN sequelize db:seed:all
 ---> Running in a2da59cc7310

Sequelize CLI [Node: 9.3.0, CLI: 3.2.0, ORM: 4.31.0]

WARNING: This version of Sequelize CLI is not fully compatible with Sequelize v4. https://github.com/sequelize/cli#sequelize-support

Loaded configuration file "pg/config/config.js".
Using environment "development".
Thu, 11 Jan 2018 03:54:47 GMT sequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security, read more at http://docs.sequelizejs.com/manual/tutorial/querying.html#operators at ../node_modules/sequelize/lib/sequelize.js:237:13
== 20171218103558-Permissions: migrating =======
== 20171218103558-Permissions: migrated (0.048s)

== 20171218110927-Companies: migrating =======
== 20171218110927-Companies: migrated (0.041s)

== 20171218112759-User: migrating =======

ERROR: /ng-app/node_modules/bcrypt/lib/binding/bcrypt_lib.node: invalid ELF header

ERROR: Service 'iproject-api' failed to build: The command '/bin/sh -c sequelize db:seed:all' returned a non-zero code: 1

1 Answer 1

1

This is mostly a guess. But your step 7 copies all the files in your current context to /ng-app (including any node_modules folder you might have). If this node_modules folder contains binaries and they were installed on macOS or Windows then they would be the wrong architecture for the container (which would be Linux).

A simple fix for this particular case would be to exclude the node_modules folder by adding it to your .dockerignore file (https://docs.docker.com/engine/reference/builder/#dockerignore-file). This would prevent node_modules from being copied to the resulting container and the node_modules from the npm install at step 4 would be used instead.

Sign up to request clarification or add additional context in comments.

1 Comment

works great, error is gone. I simply create .dockerignore and add node_modules in it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.