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.

344 lines
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 挂载实现代码实时同步,支持热重载。
### 启动开发环境
```bash
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` 实时输出
### 常用命令
```bash
# 查看实时日志
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` | 需要重启容器加载新配置 |
---
## 方案二:重建模式(生产部署)
代码更改后重新构建镜像,适合生产环境部署。
### 完整重建流程
```bash
cd app/backend
# 1. 停止现有服务
docker-compose down
# 2. 重新构建镜像(无缓存)
docker-compose build --no-cache
# 3. 启动服务
docker-compose up -d
```
### 快速重建(使用缓存)
```bash
# 一键重建并启动
docker-compose up --build -d
# 或
./docker-start.sh
```
### 仅更新应用代码
```bash
# 如果只有代码变更,可以快速重建
docker-compose build app --no-cache
docker-compose up -d
```
---
## 方案三:快速重启(配置更改)
仅重启容器,不重建镜像,保留所有数据。
```bash
# 重启所有服务
docker-compose restart
# 仅重启应用服务
docker-compose restart app
# 重启并查看日志
docker-compose restart app && docker-compose logs -f app
```
---
## 📋 不同场景的推荐方案
### 场景 1修改业务逻辑代码
**推荐**:开发模式
```bash
# 启动开发环境
./dev-start.sh
# 修改 src/services/stockService.ts
# 保存后自动同步,无需其他操作
```
### 场景 2修改数据库模型Prisma Schema
**推荐**:重建模式
```bash
# 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
**推荐**:重建模式
```bash
# 1. 修改 package.json添加依赖
# 2. 重新构建
docker-compose down
docker-compose build app --no-cache
docker-compose up -d
```
### 场景 4修改配置文件.env
**推荐**:快速重启
```bash
# 1. 修改 .env.docker
# 2. 重启服务
docker-compose restart app
```
### 场景 5生产环境部署
**推荐**:生产模式
```bash
# 使用生产配置
docker-compose -f docker-compose.yml up --build -d
# 验证部署
node verify-docker.js
```
---
## 🔧 高级技巧
### 1. 进入容器内部调试
```bash
# 进入应用容器
docker-compose exec app sh
# 查看容器内的代码
ls -la /app/src/
# 手动运行命令
npx tsx src/app.ts
```
### 2. 查看容器内的日志文件
```bash
# 进入容器查看日志
docker-compose exec app sh -c "tail -f /app/logs/combined-*.log"
```
### 3. 强制刷新(清除缓存)
```bash
# 清除 Docker 构建缓存
docker builder prune -f
# 重新构建
docker-compose up --build -d
```
### 4. 同时运行开发和生产环境
```bash
# 终端 1启动开发环境端口 3000
./dev-start.sh
# 终端 2修改代码实时查看效果
```
### 5. 数据库变更后同步
```bash
# 如果修改了数据库初始化脚本
docker-compose down -v # 删除数据卷
docker-compose up -d # 重新初始化
```
---
## 🐛 常见问题
### 问题 1代码修改后没有生效
**原因**:可能是缓存或挂载问题
**解决**
```bash
# 方案 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
**解决**
```bash
# 开发模式已使用命名卷隔离 node_modules通常无需处理
# 如需重新安装依赖:
docker-compose -f docker-compose.dev.yml exec app npm install
```
### 问题 3Prisma Client 未更新
**原因**:修改 schema 后需要重新生成 Client
**解决**
```bash
# 进入容器重新生成
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 端口
**解决**
```bash
# 查看占用进程
lsof -i :3000
# 或修改 docker-compose.dev.yml 的端口映射
ports:
- "3001:3000" # 改为 3001 端口
```
---
## 📝 最佳实践
### 开发流程
1. **日常开发**:使用开发模式
```bash
./dev-start.sh
```
2. **修改代码**:在宿主机编辑,容器内自动同步
3. **测试验证**:访问 http://localhost:3000
4. **提交代码**:正常 git 提交流程
5. **生产部署**:重建模式
```bash
docker-compose up --build -d
```
### 文件修改 checklist
| 文件类型 | 同步方式 | 是否需要重建 |
|---------|---------|------------|
| `src/**/*.ts` | 自动同步 | ❌ 否 |
| `src/**/*.js` | 自动同步 | ❌ 否 |
| `prisma/schema.prisma` | 需重启 | ⚠️ 建议重建 |
| `package.json` | 需重启 | ✅ 需要重建 |
| `.env` | 需重启 | ⚠️ 重启即可 |
| `Dockerfile` | 需重建 | ✅ 需要重建 |
| `docker-compose.yml` | 需重建 | ✅ 需要重建 |
---
## 📚 相关文档
- [Docker 部署指南](./DOCKER_README.md)
- [开发启动脚本](./dev-start.sh)
- [生产启动脚本](./docker-start.sh)
- [部署验证脚本](./verify-docker.js)