使用Docker Compose运行NestJS+MariaDB应用时遇模块缺失错误求助
问题分析与解决方案
核心问题
- Dockerfile路径拼写错误:WORKDIR写成了
/user/src/app,正确系统路径应为/usr/src/app,导致构建产物dist生成在错误目录,启动时找不到目标文件。 - Docker Compose挂载路径不匹配:挂载的
./src:/app/src与容器内工作目录不一致,且本地挂载会覆盖容器内的代码目录,干扰构建产物的正常读取。 - 构建依赖缺失:
npm ci --omit=dev会跳过开发依赖,而NestJS的构建工具(如@nestjs/cli、typescript)通常在devDependencies中,直接省略会导致构建失败,生成不出dist目录。
修正后的配置
1. Dockerfile 修正
FROM node:18-alpine # 修正工作目录为正确的系统路径 WORKDIR /usr/src/app # 先复制package文件,利用Docker缓存优化构建速度 COPY package*.json ./ # 安装所有依赖(包括开发依赖用于构建) RUN npm ci # 执行项目构建 RUN npm run build # 构建完成后移除开发依赖,减小镜像体积 RUN npm ci --omit=dev USER node CMD ["npm", "run", "start:prod"]
2. Docker Compose 修正
version: '3.5' services: app: build: context: . dockerfile: Dockerfile ports: - '3000:3000' depends_on: - database env_file: - .env # 生产环境无需挂载本地src目录,避免覆盖容器内构建产物 # 若为开发环境需要热重载,可改为挂载正确路径:./src:/usr/src/app/src networks: - mariadb database: image: mariadb:10.6 restart: always container_name: MARIADB networks: - mariadb env_file: - docker.env volumes: - ./mariadb_data:/var/lib/mysql ports: - '3306:3306' networks: mariadb: driver: bridge
额外检查项
- 确保
package.json中的start:prod脚本正确指向构建产物:"scripts": { "build": "nest build", "start:prod": "node dist/main" } - 构建前清理本地缓存,避免旧文件干扰:
rm -rf node_modules dist docker-compose build --no-cache depends_on仅保证容器启动顺序,不保证数据库服务就绪,可添加wait-for-it等脚本确保数据库完全启动后再启动应用。
内容的提问来源于stack exchange,提问作者awovu netux
相关产品推荐
相关产品推荐

