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

使用Docker Compose运行NestJS+MariaDB应用时遇模块缺失错误求助

问题分析与解决方案

核心问题

  1. Dockerfile路径拼写错误:WORKDIR写成了/user/src/app,正确系统路径应为/usr/src/app,导致构建产物dist生成在错误目录,启动时找不到目标文件。
  2. Docker Compose挂载路径不匹配:挂载的./src:/app/src与容器内工作目录不一致,且本地挂载会覆盖容器内的代码目录,干扰构建产物的正常读取。
  3. 构建依赖缺失: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:29