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
6.8 KiB
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
问题 2:node_modules 不同步
原因:Volume 挂载覆盖了容器内的 node_modules
解决:
# 开发模式已使用命名卷隔离 node_modules,通常无需处理
# 如需重新安装依赖:
docker-compose -f docker-compose.dev.yml exec app npm install
问题 3:Prisma 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 端口
📝 最佳实践
开发流程
-
日常开发:使用开发模式
./dev-start.sh -
修改代码:在宿主机编辑,容器内自动同步
-
测试验证:访问 http://localhost:3000
-
提交代码:正常 git 提交流程
-
生产部署:重建模式
docker-compose up --build -d
文件修改 checklist
| 文件类型 | 同步方式 | 是否需要重建 |
|---|---|---|
src/**/*.ts |
自动同步 | ❌ 否 |
src/**/*.js |
自动同步 | ❌ 否 |
prisma/schema.prisma |
需重启 | ⚠️ 建议重建 |
package.json |
需重启 | ✅ 需要重建 |
.env |
需重启 | ⚠️ 重启即可 |
Dockerfile |
需重建 | ✅ 需要重建 |
docker-compose.yml |
需重建 | ✅ 需要重建 |