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
相关产品推荐
相关产品推荐

