You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

Docker 代码同步指南

本文档说明如何在代码更改后同步到 Docker 容器中。

🚀 三种同步方案

方案 适用场景 同步速度 特点
开发模式 日常开发 实时 热重载,自动同步
重建模式 生产部署 2-3分钟 全新镜像,干净环境
快速重启 配置更改 10秒 重启容器,保留数据

方案一:开发模式(推荐)

使用 Volume 挂载实现代码实时同步,支持热重载。

启动开发环境

cd app/backend

# Windows
-dev-start.bat

# Linux/Mac
./dev-start.sh

工作原理

宿主机                    Docker 容器
├─ src/        ────────►  /app/src/         (只读挂载)
├─ prisma/     ────────►  /app/prisma/     (只读挂载)
├─ package.json ───────►  /app/package.json (只读挂载)
└─ logs/       ◄────────  /app/logs/        (读写挂载)

特性

  • 实时同步:修改 src/ 下的代码立即生效
  • 热重载:使用 tsx watch 自动重启服务
  • 无需重建:无需 docker build,秒级同步
  • 调试友好:支持 console.log 实时输出

常用命令

# 查看实时日志
docker-compose -f docker-compose.dev.yml logs -f app

# 重启应用服务
docker-compose -f docker-compose.dev.yml restart app

# 停止开发环境
docker-compose -f docker-compose.dev.yml stop

# 完全删除(包括数据)
docker-compose -f docker-compose.dev.yml down -v

文件变更自动同步

操作 效果
修改 src/**/*.ts 服务自动重启,变更立即生效
修改 prisma/schema.prisma 需要重启容器重新生成 Client
修改 package.json 需要重启容器重新安装依赖
修改 .env 需要重启容器加载新配置

方案二:重建模式(生产部署)

代码更改后重新构建镜像,适合生产环境部署。

完整重建流程

cd app/backend

# 1. 停止现有服务
docker-compose down

# 2. 重新构建镜像(无缓存)
docker-compose build --no-cache

# 3. 启动服务
docker-compose up -d

快速重建(使用缓存)

# 一键重建并启动
docker-compose up --build -d

# 或
./docker-start.sh

仅更新应用代码

# 如果只有代码变更,可以快速重建
docker-compose build app --no-cache
docker-compose up -d

方案三:快速重启(配置更改)

仅重启容器,不重建镜像,保留所有数据。

# 重启所有服务
docker-compose restart

# 仅重启应用服务
docker-compose restart app

# 重启并查看日志
docker-compose restart app && docker-compose logs -f app

📋 不同场景的推荐方案

场景 1修改业务逻辑代码

推荐:开发模式

# 启动开发环境
./dev-start.sh

# 修改 src/services/stockService.ts
# 保存后自动同步,无需其他操作

场景 2修改数据库模型Prisma Schema

推荐:重建模式

# 1. 修改 prisma/schema.prisma

# 2. 重新构建并启动
docker-compose down
docker-compose up --build -d

# 3. 执行数据库迁移
docker-compose exec app npx prisma migrate dev

场景 3添加新依赖package.json

推荐:重建模式

# 1. 修改 package.json添加依赖

# 2. 重新构建
docker-compose down
docker-compose build app --no-cache
docker-compose up -d

场景 4修改配置文件.env

推荐:快速重启

# 1. 修改 .env.docker

# 2. 重启服务
docker-compose restart app

场景 5生产环境部署

推荐:生产模式

# 使用生产配置
docker-compose -f docker-compose.yml up --build -d

# 验证部署
node verify-docker.js

🔧 高级技巧

1. 进入容器内部调试

# 进入应用容器
docker-compose exec app sh

# 查看容器内的代码
ls -la /app/src/

# 手动运行命令
npx tsx src/app.ts

2. 查看容器内的日志文件

# 进入容器查看日志
docker-compose exec app sh -c "tail -f /app/logs/combined-*.log"

3. 强制刷新(清除缓存)

# 清除 Docker 构建缓存
docker builder prune -f

# 重新构建
docker-compose up --build -d

4. 同时运行开发和生产环境

# 终端 1启动开发环境端口 3000
./dev-start.sh

# 终端 2修改代码实时查看效果

5. 数据库变更后同步

# 如果修改了数据库初始化脚本
docker-compose down -v  # 删除数据卷
docker-compose up -d     # 重新初始化

🐛 常见问题

问题 1代码修改后没有生效

原因:可能是缓存或挂载问题

解决

# 方案 A重启应用服务
docker-compose -f docker-compose.dev.yml restart app

# 方案 B强制重新创建容器
docker-compose -f docker-compose.dev.yml up -d --force-recreate app

问题 2node_modules 不同步

原因Volume 挂载覆盖了容器内的 node_modules

解决

# 开发模式已使用命名卷隔离 node_modules通常无需处理
# 如需重新安装依赖:
docker-compose -f docker-compose.dev.yml exec app npm install

问题 3Prisma Client 未更新

原因:修改 schema 后需要重新生成 Client

解决

# 进入容器重新生成
docker-compose -f docker-compose.dev.yml exec app npx prisma generate

# 或重启容器
docker-compose -f docker-compose.dev.yml restart app

问题 4端口被占用

原因:其他服务占用了 3000/3306/6379 端口

解决

# 查看占用进程
lsof -i :3000

# 或修改 docker-compose.dev.yml 的端口映射
ports:
  - "3001:3000"  # 改为 3001 端口

📝 最佳实践

开发流程

  1. 日常开发:使用开发模式

    ./dev-start.sh
    
  2. 修改代码:在宿主机编辑,容器内自动同步

  3. 测试验证:访问 http://localhost:3000

  4. 提交代码:正常 git 提交流程

  5. 生产部署:重建模式

    docker-compose up --build -d
    

文件修改 checklist

文件类型 同步方式 是否需要重建
src/**/*.ts 自动同步
src/**/*.js 自动同步
prisma/schema.prisma 需重启 ⚠️ 建议重建
package.json 需重启 需要重建
.env 需重启 ⚠️ 重启即可
Dockerfile 需重建 需要重建
docker-compose.yml 需重建 需要重建

📚 相关文档