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

如何为基于Turborepo的Monorepo配置带热重载的Docker本地开发环境?

解决方案:Turborepo + pnpm 本地开发 Docker 热重载配置

核心思路

本地开发环境的Docker配置重点是:挂载本地代码目录实现热重载、复用pnpm缓存加速依赖安装、确保容器内正确识别Monorepo结构,无需构建生产镜像。


1. 根目录创建 .dockerignore

避免不必要的文件被复制或挂载到容器:

node_modules
dist
.next
pnpm-lock.yaml
.git
.gitignore
docs
script
LICENSE
FUNDING.json

2. Web 服务 Dockerfile(apps/web/Dockerfile)

适配Next.js项目的本地开发配置:

# 使用Node.js 20 Alpine镜像,兼顾轻量性和兼容性
FROM node:20-alpine

# 全局安装pnpm
RUN npm install -g pnpm@latest

# 设置容器内工作目录
WORKDIR /app

# 先复制根目录的Monorepo配置文件,利用Docker缓存减少依赖安装时间
COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./

# 安装所有Monorepo依赖(包括公共包)
RUN pnpm install

# 复制当前Web服务的package.json
COPY apps/web/package.json ./apps/web/

# 挂载本地代码目录,实现文件修改后热重载
VOLUME ["/app/apps/web/src", "/app/apps/web/public", "/app/packages"]

# 启动Next.js开发服务器(需确保web的package.json中dev命令指定端口3001)
CMD ["pnpm", "--filter", "web", "dev"]

3. API 服务 Dockerfile(apps/api/Dockerfile)

适配Node.js/TypeScript API服务的本地开发配置:

FROM node:20-alpine

RUN npm install -g pnpm@latest

WORKDIR /app

COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./

RUN pnpm install

COPY apps/api/package.json ./apps/api/

VOLUME ["/app/apps/api/src", "/app/packages"]

# 启动API开发服务(需确保api的package.json中dev命令支持热重载,如tsx watch)
CMD ["pnpm", "--filter", "api", "dev"]

4. 调整 docker-compose.yml

优化本地开发的容器配置:

version: '3.9'

services:
  postgres:
    container_name: postgres
    image: postgres:16.1-alpine
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    networks:
      - app_network
    # 挂载本地卷保存数据库数据,避免容器销毁后数据丢失
    volumes:
      - postgres_data:/var/lib/postgresql/data

  web:
    container_name: web
    build:
      context: .
      dockerfile: ./apps/web/Dockerfile
    environment:
      - DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres
      - NEXT_PUBLIC_API_URL=http://api:3000 # 容器内访问API的内部地址
    ports:
      - 3001:3001
    networks:
      - app_network
    # 挂载本地代码,同时排除容器内node_modules避免冲突
    volumes:
      - ./apps/web/src:/app/apps/web/src
      - ./apps/web/public:/app/apps/web/public
      - ./packages:/app/packages
      - /app/node_modules
      - /app/apps/web/node_modules

  api:
    container_name: api
    build:
      context: .
      dockerfile: ./apps/api/Dockerfile
    environment:
      - DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres
    ports:
      - 3000:3000
    networks:
      - app_network
    volumes:
      - ./apps/api/src:/app/apps/api/src
      - ./packages:/app/packages
      - /app/node_modules
      - /app/apps/api/node_modules

networks:
  app_network:
    driver: bridge

volumes:
  postgres_data:

关键注意事项

  • 确保每个服务的package.json中dev命令支持热重载:Web服务需配置next dev -p 3001,API服务可使用tsx watch src/index.ts等工具。
  • 首次启动时Docker会完成依赖安装,后续修改本地代码会自动触发容器内服务热重载。
  • 若依赖更新,需重新执行docker-compose build或在容器内运行pnpm install。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:19