使用全局docker-compose启动Next.js应用时找不到server.js问题
问题
构建过程正常,但执行启动命令node ./apps/landing/server.js时提示找不到server.js文件,报错信息如下:
node: internal/modules/cjs/loader: 1137 throw err; Error: Cannot find module '/app/apps/landing/server.js' at Module._resolveFilename (node: internal/modules/cjs/loader: 1134:15) at Module._load (node: internal/modules/cjs/loader: 975:27) at Function.executeUserEntryPoint [as runMain] (node: internal/main/run_main: 128:12) at node: internal/main/run_main_module:28:49 { code: 'MODULE_NOT_FOUND', requireStack: [] } Node.js v18.19.0
通过Docker Desktop查看容器内该文件确实存在,但手动导入本地生成的/app/apps/landing/server.js后,应用可正常启动。
原因分析
- 本地目录挂载覆盖构建产物:docker-compose.yml中配置了
- .:/app,将本地项目根目录挂载到容器内的/app目录。容器构建阶段生成的server.js属于镜像内的构建产物,但本地开发环境中通常不会提前生成该文件,挂载后容器内的构建产物被本地空目录覆盖,导致启动时找不到文件。 - Next.js standalone输出路径匹配错误:Next.js启用
output: "standalone"后,构建生成的server.js会位于/app/apps/landing/.next/standalone/目录下(根层级),而Dockerfile的CMD命令指向的./apps/landing/server.js路径与实际输出位置不匹配。
解决方案
方案一:移除Docker Compose本地目录挂载(推荐生产环境使用)
生产环境无需将本地目录挂载到容器,直接使用镜像内的完整构建产物即可。修改docker-compose.yml:
version: '3.8' services: landing: container_name: landing image: landing build: context: . dockerfile: ./apps/landing/Dockerfile volumes: - pnpm-store:/pnpm/store ports: - "3000:3000" environment: - PNPM_HOME=/pnpm - PATH=$PNPM_HOME:$PATH user: "1001" networks: - landing networks: landing: name: landing driver: bridge volumes: pnpm-store: name: pnpm-store
方案二:修正Dockerfile启动命令路径
根据Next.js standalone的输出结构,server.js实际位于容器/app目录下,调整Dockerfile的CMD命令:
# 替换原CMD命令 CMD node ./server.js
方案三:本地预先生成构建产物(仅开发环境临时使用)
在本地执行构建命令生成server.js后再启动容器:
pnpm turbo run build --filter=landing...
此方法仅适用于开发调试,不适合生产环境部署。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

