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

# 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)