99 lines
2.8 KiB
Markdown
99 lines
2.8 KiB
Markdown
# Docker 构建优化说明
|
||
|
||
## 🎯 优化目标
|
||
解决 Docker 构建时传输 17GB+ 数据导致构建时间过长的问题。
|
||
|
||
## 📊 优化前后对比
|
||
|
||
### 优化前
|
||
- **构建上下文大小**: 17GB+
|
||
- **传输时间**: 215秒+
|
||
- **问题**: `uploads/` 目录中的用户上传文件被包含在构建上下文中
|
||
|
||
### 优化后
|
||
- **构建上下文大小**: 预计 < 1GB
|
||
- **传输时间**: 预计 < 30秒
|
||
- **优化**: 通过 `.dockerignore` 正确排除不必要的文件
|
||
|
||
## 🔧 具体优化措施
|
||
|
||
### 1. 更新 `.dockerignore` 文件
|
||
增强了排除规则,确保以下内容不会被包含在 Docker 构建上下文中:
|
||
|
||
- ✅ **用户上传文件**: `uploads/*`
|
||
- ✅ **备份文件**: `backups/*`
|
||
- ✅ **压缩包**: `*.tar.gz`, `*.zip`
|
||
- ✅ **日志文件**: `*.log`
|
||
- ✅ **开发工具配置**: `.vscode`, `.idea`, `.cursor`
|
||
- ✅ **临时文件**: `.cache`, `tmp`, `temp`
|
||
- ✅ **文档文件**: `*.md`, `README*`
|
||
|
||
### 2. 修复部署脚本
|
||
**关键问题**: 以前 `.dockerignore` 文件没有被打包到更新包中,导致服务器使用旧配置。
|
||
|
||
**解决方案**: 使用 `rsync` + 手动复制的方式确保 `.dockerignore` 被包含:
|
||
|
||
```bash
|
||
# 使用 rsync 复制项目文件
|
||
rsync -a --exclude='...' ./ "$TEMP_PKG_DIR/"
|
||
|
||
# 确保 .dockerignore 被包含
|
||
cp .dockerignore "$TEMP_PKG_DIR/"
|
||
cp Dockerfile "$TEMP_PKG_DIR/"
|
||
|
||
# 创建压缩包
|
||
tar -czf project-update-v2.0.tar.gz -C "$TEMP_PKG_DIR" .
|
||
```
|
||
|
||
## 📈 预期效果
|
||
|
||
### 构建时间优化
|
||
| 阶段 | 优化前 | 优化后 | 改进 |
|
||
|------|--------|--------|------|
|
||
| 加载构建上下文 | 215秒 | ~30秒 | **85%↓** |
|
||
| 总构建时间 | ~350秒 | ~120秒 | **65%↓** |
|
||
|
||
### 网络传输优化
|
||
- **本地 → 服务器**: 打包大小从包含不必要文件减少到只有 ~12MB 核心代码
|
||
- **Docker 构建上下文**: 从 17GB 减少到 < 1GB
|
||
|
||
## 🚀 使用方法
|
||
|
||
下次部署时,只需正常运行部署脚本:
|
||
|
||
```bash
|
||
bash update-deploy.sh
|
||
```
|
||
|
||
部署脚本会:
|
||
1. 自动使用优化的打包方式
|
||
2. 确保 `.dockerignore` 被传输到服务器
|
||
3. Docker 构建时会正确排除不必要的文件
|
||
|
||
## 📝 维护建议
|
||
|
||
### 服务器端 uploads 目录
|
||
服务器上的 `uploads/` 目录会随着用户上传增长,但由于 `.dockerignore` 的配置,这些文件**不会**被包含在 Docker 构建上下文中。
|
||
|
||
### 定期清理
|
||
如果服务器磁盘空间不足,可以清理:
|
||
- `backups/` 目录中的旧备份
|
||
- `.next/` 构建缓存(会自动重建)
|
||
- Docker 未使用的镜像:`docker system prune -a`
|
||
|
||
## ✅ 验证优化效果
|
||
|
||
部署后,观察构建日志中的这一行:
|
||
|
||
```
|
||
#5 [app internal] load build context
|
||
#5 transferring context: XXX MB
|
||
```
|
||
|
||
如果看到传输大小变成 **< 1GB**,说明优化成功!
|
||
|
||
## 🎉 优化完成
|
||
|
||
现在每次部署应该快很多了!从 350秒+ 降低到 120秒左右。
|
||
|