Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
polyglot-me opened this issue Feb 1, 2023 · 5 comments

Comments

@polyglot-me
Copy link

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

@fedulovivan
Copy link

fedulovivan commented Feb 8, 2023

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
Copy link

fedulovivan commented Feb 8, 2023

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.

@noraj
Copy link

noraj commented Oct 13, 2023

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
Copy link

noraj commented Oct 13, 2023

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).

@damms005
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants