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

使用全局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后,应用可正常启动。

原因分析
  1. 本地目录挂载覆盖构建产物:docker-compose.yml中配置了- .:/app,将本地项目根目录挂载到容器内的/app目录。容器构建阶段生成的server.js属于镜像内的构建产物,但本地开发环境中通常不会提前生成该文件,挂载后容器内的构建产物被本地空目录覆盖,导致启动时找不到文件。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:11:02