Docker中npm install执行后仍找不到sequelize模块,如何解决?
Cannot find module 'sequelize' 为引入Dockerfile目录外的文件,我扩展了构建上下文,执行命令docker build -f Dockerfile ../../构建镜像,但运行容器时出现Cannot find module 'sequelize'错误。package.json和package-lock.json中明确包含sequelize包,构建日志也显示npm install已执行,但问题依旧。用相同方法创建的测试案例却能正常运行,求解决方案。
文件结构
- model - servers - subscribeship(在此目录执行Docker命令) - Dockerfile - index.js - package.json - package-lock.json
Dockerfile内容
FROM node:10 WORKDIR /app COPY ./servers/subscribeship/package*.json . RUN npm install COPY ./servers/subscribeship . COPY ./models ../../models EXPOSE 3000 CMD ["node","index.js"]
构建镜像日志
[+] Building 7.5s (11/11) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 231B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 34B 0.0s => [internal] load metadata for docker.io/library/node:10 2.7s => [1/6] FROM docker.io/library/node:10@sha256:59531d2835edd5161c8f9512f9e095b1836f7a1fcb0ab73e005ec46047384911 0.0s => [internal] load build context 1.3s => => transferring context: 23.27MB 1.3s => CACHED [2/6] WORKDIR /app 0.0s => [3/6] COPY ./servers/subscribeship/package*.json . 0.1s => [4/6] RUN npm install 2.6s => [5/6] COPY ./servers/subscribeship . 0.4s => [6/6] COPY ./models ../../models 0.0s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:9a87c205096b94e442a9f40e7c050ac68383f2da7fd8b285b5ee840c20f922af
运行容器日志
internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module 'sequelize' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/models/index.js:5:19) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3)
测试案例说明
我创建了与servers同级的bug目录,在其下的bug1目录中用相同方法构建运行,结果正常。
测试案例命令
docker build -f Dockerfile ../../ docker run (imageId)
测试案例文件结构
- bug - bug1(在此目录执行命令) - Dockerfile - package.json - package-lock.json - .dockerignore
测试案例Dockerfile内容
FROM node:10 WORKDIR /app COPY ./bug/bug1/package.json . RUN npm install COPY ./bug/bug1 . EXPOSE 3000 CMD ["node","index.js"]
问题根源
从报错日志看,sequelize找不到的核心问题是:模型文件被错误拷贝到了容器的../../models路径——这个路径指向容器根目录的上级,属于不存在的外部位置。Node.js加载/models/index.js时,会从该文件所在目录的node_modules查找依赖,但这个位置根本没有安装任何包,自然找不到sequelize。
测试案例能正常运行,是因为它所有代码都在容器的/app工作目录下,Node.js可以正确加载/app/node_modules里的依赖。
修复步骤
1. 修正模型文件的拷贝路径
把模型文件拷贝到容器的工作目录内(比如/app/models),替换Dockerfile中的错误拷贝命令:
# 原错误命令 # COPY ./models ../../models # 替换为 COPY ./models ./models
2. 确认模型文件的依赖引用正确
如果/models/index.js里是直接require('sequelize'),现在模型文件在/app/models下,Node.js会自动从上级目录的/app/node_modules查找依赖,路径已正确。如果之前有自定义的相对路径引用,需同步调整。
3. 重新构建并运行容器
执行以下命令重新构建镜像并运行:
docker build -f Dockerfile ../../ docker run <imageId>
可选优化:简化构建上下文路径
直接在项目根目录(包含model和servers的目录)执行构建命令,可让Dockerfile路径更简洁,减少出错概率:
在根目录执行:
docker build -f ./servers/subscribeship/Dockerfile .
对应的Dockerfile可简化为:
FROM node:10 WORKDIR /app COPY ./servers/subscribeship/package*.json . RUN npm install COPY ./servers/subscribeship . COPY ./models ./models EXPOSE 3000 CMD ["node","index.js"]
内容的提问来源于stack exchange,提问作者JHIH-LEI

