Docker环境下Node.js跨目录require pg模块报错求助
Node.js Docker环境中无法找到全局安装的pg模块问题
错误信息
> node app.js /deploy/ui/site node:internal/modules/cjs/loader:1078 throw err; ^ Error: Cannot find module 'pg' Require stack: - /deploy/lib/db.js - /deploy/ui/site/app.js at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15) at Module._load (node:internal/modules/cjs/loader:920:27) at Module.require (node:internal/modules/cjs/loader:1141:19) at require (node:internal/modules/cjs/helpers:110:18) at Object.<anonymous> (/deploy/lib/db.js:3:18) at Module._compile (node:internal/modules/cjs/loader:1254:14) at Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Module._load (node:internal/modules/cjs/loader:958:12) at Module.require (node:internal/modules/cjs/loader:1141:19) { code: 'MODULE_NOT_FOUND', requireStack: [ '/deploy/lib/db.js', '/deploy/ui/site/app.js' ] }
项目文件结构及代码
/lib/db.js:
const { Pool } = require('pg')
/ui/site/app.js:
const db = require('../../lib/db')
问题背景
项目在本地VS Code中运行正常,但Docker环境下启动时出现上述MODULE_NOT_FOUND错误。已尝试全局安装pg:
npm install -g pg
全局安装确认结果:
/ # npm ls -g --depth=0 /usr/local/lib +-- corepack@0.17.0 +-- npm@9.5.1 `-- pg@8.10.0
当前Dockerfile内容
# Use the official Node.js runtime as the base image FROM node:18-alpine # Set env params ENV RENDERTYPE=il2 ENV GAMEPATH="G:\Spel\" COPY lib /deploy/lib COPY mission /deploy/mission # node_modules excluded in .dockerignore COPY ui/site /deploy/ui/site # COPY package*.json ./ RUN npm install -g pg@8.8.0 # Create and set the working directory WORKDIR /deploy/ui/site # Copy the package.json and package-lock.json files to the working directory # COPY ui/site/package*.json ./ # Install dependencies RUN npm install --omit=dev --loglevel verbose # Expose port 3000 for the application EXPOSE 3000 # Start the application # CMD ["node", "app.js"] CMD ["npm", "start"] # run a temporary http server for testing
解决方案
方案1:将pg安装为项目根目录本地依赖(推荐)
全局安装的模块在非工作目录下的文件(如/deploy/lib/db.js)中可能无法被正确解析,将pg作为项目根目录的本地依赖更可靠:
- 在项目根目录(包含
lib、ui的目录)创建package.json,添加pg依赖:
{ "dependencies": { "pg": "^8.10.0" } }
- 修改Dockerfile,优先复制根目录的
package.json并安装依赖:
FROM node:18-alpine ENV RENDERTYPE=il2 ENV GAMEPATH="G:\Spel\" # 先复制根目录package文件并安装依赖 COPY package*.json /deploy/ WORKDIR /deploy RUN npm install --omit=dev # 再复制项目代码 COPY lib /deploy/lib COPY mission /deploy/mission COPY ui/site /deploy/ui/site WORKDIR /deploy/ui/site EXPOSE 3000 CMD ["npm", "start"]
方案2:配置NODE_PATH指向全局模块目录
如果坚持使用全局安装,在Dockerfile中添加NODE_PATH环境变量,让Node.js能找到全局模块:
FROM node:18-alpine ENV RENDERTYPE=il2 ENV GAMEPATH="G:\Spel\" # 添加全局模块路径到NODE_PATH ENV NODE_PATH=/usr/local/lib/node_modules COPY lib /deploy/lib COPY mission /deploy/mission COPY ui/site /deploy/ui/site RUN npm install -g pg@8.8.0 WORKDIR /deploy/ui/site RUN npm install --omit=dev --loglevel verbose EXPOSE 3000 CMD ["npm", "start"]
方案3:将pg安装到ui/site的本地依赖
如果/ui/site有独立的package.json,直接在该目录下安装pg:
修改Dockerfile,先复制ui/site的package.json并安装依赖,再复制其他代码:
FROM node:18-alpine ENV RENDERTYPE=il2 ENV GAMEPATH="G:\Spel\" COPY lib /deploy/lib COPY mission /deploy/mission # 先复制ui/site的package文件并安装依赖 COPY ui/site/package*.json /deploy/ui/site/ WORKDIR /deploy/ui/site RUN npm install --omit=dev --loglevel verbose # 再复制ui/site的其他代码 COPY ui/site /deploy/ui/site RUN npm install -g pg@8.8.0 EXPOSE 3000 CMD ["npm", "start"]
内容的提问来源于stack exchange,提问作者Asken
相关产品推荐
相关产品推荐

