242 lines
5.5 KiB
Markdown
242 lines
5.5 KiB
Markdown
# Docker 镜像优化指南
|
||
|
||
## 📊 当前镜像大小分析
|
||
|
||
| 镜像 | 大小 | 说明 |
|
||
|------|------|------|
|
||
| `langgenius/dify-api:latest` | **4.12GB** | Dify 官方 API 镜像 |
|
||
| `baodanagent-dify-api:latest` | **4.12GB** | 自定义 API 镜像 |
|
||
| `langgenius/dify-plugin-daemon` | **2.31GB** | 插件守护进程 |
|
||
| `langgenius/dify-web:latest` | **759MB** | Web 前端镜像 |
|
||
| `langgenius/dify-sandbox:0.2.15` | **848MB** | 代码执行沙箱 |
|
||
| **总计** | **~17.5GB** | 所有镜像 |
|
||
|
||
## 🔍 镜像大的原因
|
||
|
||
### 1. Dify 官方镜像本身就大
|
||
|
||
Dify 是一个复杂的 AI 应用平台,包含:
|
||
- Python 3.12 运行时
|
||
- PyTorch / Transformers(ML 框架)
|
||
- 向量数据库依赖(pgvector, qdrant, weaviate)
|
||
- 多种 LLM SDK(OpenAI, Anthropic, 本地模型等)
|
||
- Celery 异步任务框架
|
||
- 数据库 ORM 和迁移工具
|
||
|
||
### 2. 多服务架构
|
||
|
||
系统包含 6 个独立服务,每个都有自己的镜像:
|
||
- API 服务
|
||
- Web 前端
|
||
- Worker 异步任务
|
||
- Plugin Daemon 插件守护进程
|
||
- Sandbox 代码沙箱
|
||
- 数据库和缓存
|
||
|
||
## ✅ 已完成的优化
|
||
|
||
### 1. Dockerfile 优化
|
||
|
||
```dockerfile
|
||
# 清理不必要的文件
|
||
RUN apt-get clean && \
|
||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
|
||
pip cache purge 2>/dev/null || true && \
|
||
rm -rf /root/.cache/pip
|
||
```
|
||
|
||
### 2. .dockerignore 优化
|
||
|
||
创建了 `.dockerignore` 文件,排除:
|
||
- 文档文件(docs/)
|
||
- 前端源码(frontend/)
|
||
- 测试文件
|
||
- 虚拟环境
|
||
- 缓存文件
|
||
|
||
### 3. 构建缓存优化
|
||
|
||
使用 Docker BuildKit 缓存:
|
||
```bash
|
||
DOCKER_BUILDKIT=1 docker build --cache-from ...
|
||
```
|
||
|
||
## 🚀 进一步优化方案
|
||
|
||
### 方案 1:清理未使用的镜像
|
||
|
||
```bash
|
||
# 查看未使用的镜像
|
||
docker images -f "dangling=true"
|
||
|
||
# 清理悬空镜像
|
||
docker image prune -f
|
||
|
||
# 清理所有未使用的镜像(谨慎使用)
|
||
docker image prune -a -f
|
||
```
|
||
|
||
### 方案 2:使用精简基础镜像
|
||
|
||
如果不需要所有 Dify 功能,可以使用 Alpine 版本:
|
||
|
||
```dockerfile
|
||
# 替换
|
||
FROM langgenius/dify-api:latest
|
||
|
||
# 为(如果官方提供)
|
||
FROM langgenius/dify-api:alpine
|
||
```
|
||
|
||
### 方案 3:多阶段构建
|
||
|
||
```dockerfile
|
||
# 构建阶段
|
||
FROM python:3.12-slim as builder
|
||
COPY requirements.txt .
|
||
RUN pip install --user -r requirements.txt
|
||
|
||
# 运行阶段
|
||
FROM python:3.12-slim
|
||
COPY --from=builder /root/.local /root/.local
|
||
COPY api/insurance /app/api/insurance
|
||
```
|
||
|
||
### 方案 4:禁用不需要的服务
|
||
|
||
如果不需要某些功能,可以在 `docker-compose.dify.yml` 中注释掉:
|
||
|
||
```yaml
|
||
# 如果不需要代码沙箱
|
||
# sandbox:
|
||
# image: langgenius/dify-sandbox:0.2.15
|
||
# ...
|
||
|
||
# 如果不需要插件守护进程
|
||
# plugin_daemon:
|
||
# image: langgenius/dify-plugin-daemon:0.6.1-local
|
||
# ...
|
||
```
|
||
|
||
## 🛠️ 磁盘清理工具
|
||
|
||
### 使用清理脚本
|
||
|
||
```bash
|
||
# 运行清理脚本
|
||
./docker-cleanup.sh
|
||
```
|
||
|
||
### 手动清理命令
|
||
|
||
```bash
|
||
# 1. 查看 Docker 磁盘使用
|
||
docker system df
|
||
|
||
# 2. 清理停止的容器
|
||
docker container prune -f
|
||
|
||
# 3. 清理悬空镜像
|
||
docker image prune -f
|
||
|
||
# 4. 清理构建缓存
|
||
docker builder prune -f
|
||
|
||
# 5. 清理所有未使用资源(谨慎)
|
||
docker system prune -a -f
|
||
|
||
# 6. 清理所有未使用资源包括卷(非常谨慎)
|
||
docker system prune -a -f --volumes
|
||
```
|
||
|
||
## 📈 优化效果对比
|
||
|
||
| 优化措施 | 预计节省 | 说明 |
|
||
|---------|---------|------|
|
||
| 清理构建缓存 | 8-10GB | 一次性释放 |
|
||
| 清理悬空镜像 | 300-500MB | 定期清理 |
|
||
| 禁用不需要的服务 | 2-3GB | 按需裁剪 |
|
||
| 使用 .dockerignore | 50-100MB | 每次构建 |
|
||
|
||
## 🎯 推荐优化步骤
|
||
|
||
### 第一步:立即释放空间
|
||
|
||
```bash
|
||
# 清理构建缓存(最大收益)
|
||
docker builder prune -f --keep-storage 2GB
|
||
|
||
# 清理悬空镜像
|
||
docker image prune -f
|
||
```
|
||
|
||
### 第二步:评估服务需求
|
||
|
||
根据实际需求决定保留哪些服务:
|
||
|
||
| 服务 | 必要性 | 说明 |
|
||
|------|:------:|------|
|
||
| baodan-api | ✅ 必须 | 核心 API 服务 |
|
||
| baodan-web | ✅ 必须 | 管理后台 |
|
||
| baodan-worker | ⚠️ 按需 | 异步任务(可选) |
|
||
| db | ✅ 必须 | 数据库 |
|
||
| redis | ✅ 必须 | 缓存 |
|
||
| plugin_daemon | ⚠️ 按需 | 插件功能(可选) |
|
||
| sandbox | ⚠️ 按需 | 代码执行(可选) |
|
||
|
||
### 第三步:优化 Dockerfile
|
||
|
||
已优化的 Dockerfile 包含:
|
||
- 清理 apt 缓存
|
||
- 清理 pip 缓存
|
||
- 删除临时文件
|
||
|
||
### 第四步:定期维护
|
||
|
||
```bash
|
||
# 添加到 crontab(每周清理一次)
|
||
0 2 * * 0 cd /path/to/project && docker system prune -f >> /var/log/docker-cleanup.log 2>&1
|
||
```
|
||
|
||
## 📝 注意事项
|
||
|
||
1. **不要删除正在使用的镜像**:先停止容器再删除镜像
|
||
2. **谨慎使用 `--volumes`**:会删除所有未挂载的数据卷
|
||
3. **备份重要数据**:清理前确保数据已备份
|
||
4. **保留基础镜像**:避免重复下载官方镜像
|
||
|
||
## 🔗 相关命令参考
|
||
|
||
```bash
|
||
# 查看镜像详情
|
||
docker inspect <image_id>
|
||
|
||
# 查看镜像层
|
||
docker history <image_id>
|
||
|
||
# 导出镜像(备份)
|
||
docker save -o baodan-api.tar baodanagent-dify-api:latest
|
||
|
||
# 导入镜像(恢复)
|
||
docker load -i baodan-api.tar
|
||
|
||
# 推送到私有仓库
|
||
docker tag baodanagent-dify-api:latest your-registry.com/baodan-api:latest
|
||
docker push your-registry.com/baodan-api:latest
|
||
```
|
||
|
||
## 📊 最终优化效果
|
||
|
||
经过优化后,预计磁盘使用:
|
||
|
||
| 项目 | 优化前 | 优化后 | 节省 |
|
||
|------|--------|--------|------|
|
||
| 镜像大小 | 17.5GB | 10-12GB | 5-7GB |
|
||
| 构建缓存 | 10.3GB | 2GB | 8GB |
|
||
| **总计** | **~28GB** | **~14GB** | **~14GB** |
|
||
|
||
---
|
||
|
||
**优化完成时间**: 2026-06-19
|
||
**优化状态**: ✅ 已完成基础优化
|