Docker部署NestJS应用:生产环境启动报错找不到dist/main模块
问题:Docker生产容器找不到/app/dist/main模块
我是Docker新手,正在为API构建开发和生产版本容器。docker-compose up dev运行正常,但执行docker-compose up prod时提示找不到/app/dist/main模块,怀疑是未复制或创建必要文件目录,相关配置及错误日志如下:
错误日志
[+] Running 2/2 - Network sip-api_nestjs-network Created 0.7s - Container api-prod Created 0.1s Attaching to api-prod api-prod | api-prod | > sip-api@0.0.1 start:prod api-prod | > node dist/main api-prod | api-prod | node:internal/modules/cjs/loader:959 api-prod | throw err; api-prod | ^ api-prod | api-prod | Error: Cannot find module '/app/dist/main' api-prod | at Function.Module._resolveFilename (node:internal/modules/cjs/loader:956:15) api-prod | at Function.Module._load (node:internal/modules/cjs/loader:804:27) api-prod | at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) api-prod | at node:internal/main/run_main_module:17:47 { api-prod | code: 'MODULE_NOT_FOUND', api-prod | requireStack: [] api-prod | } api-prod exited with code 1
Dockerfile
############################# # BUILD FOR LOCAL DEVELOPMENT ############################# FROM node:16-alpine AS development USER node WORKDIR /app COPY --chown=node:node package*.json ./ RUN npm ci COPY --chown=node:node . . ###################### # BUILD FOR PRODUCTION ###################### FROM node:16-alpine AS build USER node WORKDIR /app COPY --chown=node:node package*.json ./ COPY --chown=node:node --from=development /app/node_modules ./node_modules COPY --chown=node:node . . RUN npm run build ENV NODE_ENV=production RUN npm ci --only=production && npm cache clean --force ################### # PRODUCTION ################### FROM node:16-alpine AS production COPY --chown=node:node --from=build /app/node_modules ./node_modules COPY --chown=node:node --from=build /app/views ./views COPY --chown=node:node --from=build /app/dist ./dist CMD [ "node", "dist/main.js" ]
docker-compose.yml
version: '3.8' services: dev: container_name: api-dev image: api-dev build: context: . target: development dockerfile: ./Dockerfile ports: - 3200:3200 - 9229:9229 networks: - nestjs-network working_dir: /app volumes: - ./:/app - /app/node_modules command: npm run start:dev restart: unless-stopped prod: container_name: api-prod image: api-prod build: context: . target: production dockerfile: ./Dockerfile ports: - 3200:3200 - 9230:9230 networks: - nestjs-network working_dir: /app volumes: - ./:/app - /app/node_modules command: npm run start:prod restart: unless-stopped networks: nestjs-network:
解决方法
1. 移除生产服务的本地目录挂载
prod服务配置中挂载了本地./:/app目录,会直接覆盖容器内构建阶段生成的/app/dist目录。如果本地机器未执行npm run build生成dist文件夹,容器启动后必然找不到模块。
修改docker-compose.yml中prod服务的volumes部分,删除本地目录挂载:
prod: # 其他配置保持不变 volumes: # 移除 - ./:/app 这一行 - /app/node_modules
2. 统一启动命令的文件后缀
Dockerfile的production阶段CMD为node dist/main.js,但docker-compose.yml中prod服务的command执行的是npm run start:prod,而该脚本对应的命令是node dist/main(缺少.js后缀)。虽然Node.js通常能自动识别,但建议保持一致:
- 要么修改
package.json中的start:prod脚本为node dist/main.js - 要么修改docker-compose中prod的command为
node dist/main.js
3. 验证构建阶段的dist目录生成
在build阶段执行npm run build后,确认项目会在/app/dist下生成main.js文件。可临时修改Dockerfile,添加目录检查命令:
RUN npm run build RUN ls -la /app/dist # 新增此行查看dist目录内容
重新构建镜像后,查看输出确认main.js存在。
内容的提问来源于stack exchange,提问作者Esteban Varela
相关产品推荐
相关产品推荐

