# 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 # 查看镜像层 docker history # 导出镜像(备份) 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 **优化状态**: ✅ 已完成基础优化