Docker容器中sqlite3出现Exec format error问题求助
问题描述
我正在开发一个小型个人爱好项目,后端用sqlite3做数据库,想把它Docker化部署到服务器,但遇到了问题,搜了很多方案都没用。
已尝试但无效的操作
- 将node_modules添加到.dockerignore
- 卸载sqlite3、清理yarn缓存后重新安装
- 删除node_modules并执行yarn install
- 知道有些npm包的二进制文件是针对Windows(我本地系统)打包的,可能在Linux容器里用不了,但Dockerfile里已经执行了yarn install,搞不懂为啥还出问题。
我的Dockerfile
# syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY package.json ./ COPY yarn.lock ./ RUN yarn install COPY . . CMD ["yarn", "start"] EXPOSE 3000
运行容器的命令
docker build -t my-app .
然后执行:
docker run -dp 127.0.0.1:3000:3000 my-app
问题现象
容器日志报错:
2024-06-10 20:43:52 yarn run v1.22.19 2024-06-10 20:43:52 $ nodemon app.ts 2024-06-10 20:43:52 [nodemon] 3.1.0 2024-06-10 20:43:52 [nodemon] to restart at any time, enter `rs` 2024-06-10 20:43:52 [nodemon] watching path(s): *.* 2024-06-10 20:43:52 [nodemon] watching extensions: ts,json 2024-06-10 20:43:52 [nodemon] starting `ts-node app.ts` 2024-06-10 20:43:53 [nodemon] app crashed - waiting for file changes before starting... 2024-06-10 20:43:53 Error: Error loading shared library /app/node_modules/sqlite3/build/Release/node_sqlite3.node: Exec format error 2024-06-10 20:43:53 at Object.Module._extensions..node (node:internal/modules/cjs/loader:1460:18) 2024-06-10 20:43:53 at Module.load (node:internal/modules/cjs/loader:1203:32) 2024-06-10 20:43:53 at Function.Module._load (node:internal/modules/cjs/loader:1019:12) 2024-06-10 20:43:53 at Module.require (node:internal/modules/cjs/loader:1231:19) 2024-06-10 20:43:53 at require (node:internal/modules/helpers:177:18) 2024-06-10 20:43:53 at bindings (/app/node_modules/bindings/bindings.js:112:48) 2024-06-10 20:43:53 at Object.<anonymous> (/app/node_modules/sqlite3/lib/sqlite3-binding.js:1:37) 2024-06-10 20:43:53 at Module._compile (node:internal/modules/cjs/loader:1364:14) 2024-06-10 20:43:53 at Module._extensions..js (node:internal/modules/cjs/loader:1422:10) 2024-06-10 20:43:53 at Object.require.extensions.<computed> [as .js] (/app/node_modules/ts-node/src/index.ts:1608:43) { 2024-06-10 20:43:53 code: 'ERR_DLOPEN_FAILED' 2024-06-10 20:43:53 }
解决方案
这个问题核心是sqlite3的二进制文件没有适配Linux容器环境,以下是针对性解决方法:
1. 补全Alpine镜像的编译依赖
Alpine使用musl libc,缺少sqlite3编译所需的系统工具,在yarn install前先安装依赖:
修改后的Dockerfile:
# syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app # 安装编译sqlite3需要的依赖 RUN apk add --no-cache python3 make g++ COPY package.json ./ COPY yarn.lock ./ RUN yarn install COPY . . CMD ["yarn", "start"] EXPOSE 3000
2. 强制重建sqlite3二进制文件
在容器内安装依赖后,手动触发sqlite3的重建,确保适配容器架构:
在Dockerfile的RUN yarn install后添加:
RUN npx rebuild sqlite3
3. 排查文件拷贝问题
检查.dockerignore是否确实排除了node_modules、build目录,避免本地Windows环境生成的二进制文件被拷贝进容器。如果.dockerignore配置没问题,尝试构建时添加--no-cache参数,避免复用旧的构建缓存:
docker build --no-cache -t my-app .
4. 替换为兼容更好的sqlite包
如果不想在容器内编译,可以改用better-sqlite3,它的预编译包对Alpine支持更完善,直接替换依赖即可。
内容的提问来源于stack exchange,提问作者Linexxlol
相关产品推荐
相关产品推荐

