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

Docker-compose启动Nest.js生产环境时报错Cannot find module dist/main

问题根因

你生产环境的docker-compose配置中设置了卷挂载规则:- .:/usr/src/app,该规则会在容器启动时,将宿主机当前目录的所有内容直接覆盖容器内的/usr/src/app目录。
即使你在Dockerfile中已经把开发阶段构建好的dist文件复制到了生产镜像内,启动时镜像内的dist目录也会被宿主机的目录替换:

  • 如果你本地没有提前执行过npm run build,宿主机当前目录下不存在dist文件夹,容器内的dist就会被空目录覆盖
  • 就算本地有dist文件夹,生产镜像内的dist是标准生产构建产物,也可能和本地的dist结构不一致,导致找不到main入口文件
    开发环境启动正常的原因是npm run start:dev会自动实时编译生成dist,覆盖挂载进来的目录内容,所以不会触发报错。
解决方法

任选一种方案即可:

  • 方案1(生产环境推荐):删除生产环境服务的卷挂载配置,直接使用镜像内构建好的文件
    把docker-compose.yaml里prod服务下的volumes配置直接删除:
    # 删掉prod服务下的这两行配置
    volumes:
        - .:/usr/src/app
        - /usr/src/app/node_modules
    
    生产环境不需要代码热更新能力,直接使用镜像内提前构建好的内容即可,无需挂载宿主机目录。
  • 方案2(临时调试用):如果确实需要保留挂载配置调试生产环境代码,提前在本地执行npm run build生成正确结构的dist文件夹后,再启动生产容器。
额外优化建议

你的Dockerfile中已经配置了默认启动命令CMD ["node", "dist/main"],可以删除docker-compose.yaml里prod服务下的command: npm run start:prod配置,直接使用镜像默认的启动命令即可,避免package.json中start:prod的配置和镜像CMD不一致导致额外错误。

内容的提问来源于stack exchange,提问作者yongseunglee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:36:01