node-sqlite3 icon indicating copy to clipboard operation
node-sqlite3 copied to clipboard

Getting MODULE_NOT_FOUND error while running Nodejs application with sqlite3 in the docker container

Open polyglot-me opened this issue 2 years ago • 5 comments

Issue Summary

Hi Everyone,

I'm not able to run my Nodejs v16 application in the docker container. Ending up with MODULE_NOT_FOUND error. Can someone help me what can be the issue and the solution? I'm using the latest sqlite3 version in my package.json

Here is my docker file


FROM node:16-alpine AS builder
RUN mkdir -p /myloc/usr/src/app
WORKDIR /myloc/usr/src/app

COPY package.json ./
#build all the local images in the base node container
RUN npm install
COPY . .

RUN npm run build
#RUN npm run test

FROM node:16-slim
RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app
COPY --from=builder /myloc/usr/src/app .

# Add user nodejsuser
RUN groupadd --gid 2000 nodejsuser \
  && useradd --uid 1300 --gid nodejsuser --shell /bin/bash --create-home nodejsuser
RUN chown -R nodejsuser:nodejsuser /usr/src/app

USER nodejsuser
EXPOSE 4000

EXPOSE 3000

CMD ["npm", "start"]

Image is built successfully but when I run the container I'm seeing this issue. Any help would be much appreciated.

Thanks

Relevant logs or output

Error: Cannot find module '/usr/src/app/node_modules/sqlite3/lib/binding/napi-v6-linux-glibc-x64/node_sqlite3.node' Require stack:

  • /usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js
  • /usr/src/app/node_modules/sqlite3/lib/sqlite3.js
  • /usr/src/app/build/entity/data-service/sqlite.helper.js
  • /usr/src/app/build/entity/data-service/dataservice.controller.js
  • /usr/src/app/build/route.js
  • /usr/src/app/build/index.js at Function.Module._resolveFilename (node:internal/modules/cjs/loader:985:15) at Function.Module._load (node:internal/modules/cjs/loader:833:27) at Module.require (node:internal/modules/cjs/loader:1057:19) at require (node:internal/modules/cjs/helpers:103:18) at Object. (/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js:4:17) at Module._compile (node:internal/modules/cjs/loader:1155:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10) at Module.load (node:internal/modules/cjs/loader:1033:32) at Function.Module._load (node:internal/modules/cjs/loader:868:12) at Module.require (node:internal/modules/cjs/loader:1057:19) { code: 'MODULE_NOT_FOUND', requireStack: [ '/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js', '/usr/src/app/node_modules/sqlite3/lib/sqlite3.js', '/usr/src/app/build/entity/data-service/sqlite.helper.js', '/usr/src/app/build/entity/data-service/dataservice.controller.js', '/usr/src/app/build/route.js', '/usr/src/app/build/index.js'

Version

5.1.4

Node.js Version

16

How did you install the library?

docker alpine

polyglot-me avatar Feb 01 '23 12:02 polyglot-me

problem is you building on alpine, this makes node-pre-gyp to download prebuild binary for sqlite for that platform, and then you running acutal code on debian-based distro. these two distros have different libc runtime - musl vs glibc.

fedulovivan avatar Feb 08 '23 09:02 fedulovivan

try adding following instructions in your builder layer, after RUN npm install:

WORKDIR /myloc/usr/src/app/node_modules/sqlite3
RUN npm install --target_platform=linux --target_libc=glibc

this will force node-pre-gyp to download additional binary to be used in node:16-slim.

this helped me to solve similar issue today.

fedulovivan avatar Feb 08 '23 16:02 fedulovivan

I have a similar issue where I use FROM node:20.8.0-alpine3.17 or FROM node:18.18.1-alpine3.17:

node:internal/modules/cjs/loader:1051
  throw err;
  ^

Error: Cannot find module '/usr/src/app/node_modules/sqlite3/lib/binding/napi-v6-linux-musl-x64/node_sqlite3.node'
Require stack:
- /usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js
- /usr/src/app/node_modules/sqlite3/lib/sqlite3.js
- /usr/src/app/controllers/controller_home.js
- /usr/src/app/routers/router_home.js
- /usr/src/app/webserver.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1048:15)
    at Module._load (node:internal/modules/cjs/loader:901:27)
    at Module.require (node:internal/modules/cjs/loader:1115:19)
    at require (node:internal/modules/helpers:130:18)
    at Object.<anonymous> (/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js:4:17)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Module._load (node:internal/modules/cjs/loader:938:12)
    at Module.require (node:internal/modules/cjs/loader:1115:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js',
    '/usr/src/app/node_modules/sqlite3/lib/sqlite3.js',
    '/usr/src/app/controllers/controller_home.js',
    '/usr/src/app/routers/router_home.js',
    '/usr/src/app/webserver.js'
  ]
}

Node.js v20.8.0

I don't have a multi-stage build like polyglot-me so the build and runtime environment are the same.

This architecture is claimed as supported tho: https://github.com/TryGhost/node-sqlite3#prebuilt-binaries.

noraj avatar Oct 13 '23 09:10 noraj

I looked at https://github.com/TryGhost/node-sqlite3/blob/master/.github/workflows/ci.yml and saw the build version matrix is a bit outdated (no node 19, 20, for docker/musl targeting node 16 and alpine3.15). So I tried with FROM node:16-alpine3.15 but still face the issue:

node:internal/modules/cjs/loader:988
  throw err;
  ^

Error: Cannot find module '/usr/src/app/node_modules/sqlite3/lib/binding/napi-v6-linux-musl-x64/node_sqlite3.node'
Require stack:
- /usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js
- /usr/src/app/node_modules/sqlite3/lib/sqlite3.js
- /usr/src/app/controllers/controller_home.js
- /usr/src/app/routers/router_home.js
- /usr/src/app/webserver.js
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:985:15)
    at Function.Module._load (node:internal/modules/cjs/loader:833:27)
    at Module.require (node:internal/modules/cjs/loader:1057:19)
    at require (node:internal/modules/cjs/helpers:103:18)
    at Object.<anonymous> (/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js:4:17)
    at Module._compile (node:internal/modules/cjs/loader:1155:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10)
    at Module.load (node:internal/modules/cjs/loader:1033:32)
    at Function.Module._load (node:internal/modules/cjs/loader:868:12)
    at Module.require (node:internal/modules/cjs/loader:1057:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/src/app/node_modules/sqlite3/lib/sqlite3-binding.js',
    '/usr/src/app/node_modules/sqlite3/lib/sqlite3.js',
    '/usr/src/app/controllers/controller_home.js',
    '/usr/src/app/routers/router_home.js',
    '/usr/src/app/webserver.js'
  ]
}

Note: it works with node:20.8.0-bookworm-slim (glibc).

noraj avatar Oct 13 '23 10:10 noraj

problem is you building on alpine, this makes node-pre-gyp to download prebuild binary for sqlite for that platform, and then you running acutal code on debian-based distro. these two distros have different libc runtime - musl vs glibc.

@fedulovivan please I want to learn about this node-gyp or platform-dependent building thing. How can you help me? Any resources, where can I read it up? Can I pay you for consultation? I really want and need to fill this my Node JS knowedge gap.

Thank you

damms005 avatar Jan 15 '24 01:01 damms005