|
|
# 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
|
|
|
```
|
|
|
|
|
|
### 问题 2:node_modules 不同步
|
|
|
|
|
|
**原因**:Volume 挂载覆盖了容器内的 node_modules
|
|
|
|
|
|
**解决**:
|
|
|
```bash
|
|
|
# 开发模式已使用命名卷隔离 node_modules,通常无需处理
|
|
|
# 如需重新安装依赖:
|
|
|
docker-compose -f docker-compose.dev.yml exec app npm install
|
|
|
```
|
|
|
|
|
|
### 问题 3:Prisma 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)
|