You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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作为项目根目录的本地依赖更可靠:

  1. 在项目根目录(包含lib、ui的目录)创建package.json,添加pg依赖:
{
  "dependencies": {
    "pg": "^8.10.0"
  }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:45:31