node-sqlite3
node-sqlite3 copied to clipboard
Getting MODULE_NOT_FOUND error while running Nodejs application with sqlite3 in the docker container
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
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.
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.
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.
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).
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