--- name: docker_toolbox_enhancement_plan description: 当需要继续推进 my-agent-shell 容器镜像增强改造、查看本地实验结果、或在云端构建新版镜像时,应该索引本记忆 --- # my-agent-shell 容器镜像增强改造计划与本地实验进度 > 记录时间:2026-06-25 > 相关记忆:`cloud_server_disk_usage`(服务器磁盘现状) ## 背景 当前运行在云端的 `my-agent-shell` 容器(镜像 `my-agent-shell:latest`,基于 `python:3.11-slim`)依赖不足: - docx/pptx skill 缺少 `defusedxml` - pptx skill 推荐的 `markitdown` 未安装 - 完全缺少 LibreOffice / soffice - 完全缺少 pandoc、pdftoppm(poppler-utils) - 完全缺少 Node.js / npm - 完全缺少中文字体(`fc-list` 为 0) 导致用户常见的 Office 转换、图片处理、OCR、网页截图等需求无法跑通。 ## 改造方案 ### 方案 B(已选定) 在最小方案基础上扩展常见业务能力: **系统 apt 包:** - Office:libreoffice、pandoc、poppler-utils - 图片/视频:imagemagick、ffmpeg - OCR:tesseract-ocr、tesseract-ocr-chi-sim、tesseract-ocr-chi-tra - 网页:chromium - 字体:fonts-noto-cjk、fonts-noto-color-emoji、fonts-liberation - 开发工具:jq、ripgrep、fd-find、tree **Python pip 包(加入 `docker/toolbox-requirements.txt`):** - defusedxml - markitdown[docx] - pytesseract - pdf2image **Node 全局包:** - docx - pptxgenjs **特殊处理:** - 用 NodeSource 安装 Node 20 LTS,避免 Debian 源版本过老 - 修改 ImageMagick policy.xml 允许读写 PDF - 设置 `NODE_PATH=/usr/lib/node_modules` ## 已修改文件 ### 1. `docker/terminal.Dockerfile` 主要变更: - apt 安装段加入 libreoffice、pandoc、poppler-utils、imagemagick、ffmpeg、tesseract、chromium、中文字体、开发工具 - 增加 ImageMagick PDF 策略调整 RUN 层 - 增加 NodeSource Node 20 安装 - 增加 `npm install -g docx pptxgenjs` - 末尾添加 `ENV NODE_PATH="/usr/lib/node_modules"` ### 2. `docker/toolbox-requirements.txt` 新增: - `defusedxml` - `markitdown[docx]` - `pytesseract` - `pdf2image` ## 本地实验进度 ### 实验环境 - 本地 macOS 15.6.1, arm64 - Docker Desktop - 构建命令: ```bash cd /Users/jojo/Desktop/agents/正在修复中/agents docker build -f docker/terminal.Dockerfile -t my-agent-shell:local . ``` ### 实验结果 | 指标 | 结果 | |------|------| | 构建成功 | ✅ 是 | | 新镜像大小 | **2.9 GB**(原镜像 913 MB) | | 镜像增加 | 约 **2 GB** | | 空闲内存 | ~10 MB | | 单任务峰值内存 | ~40 MB | | 并发 5×soffice + 1×chromium 峰值内存 | **~237 MB** | ### 功能验证(全部通过) | 测试项 | 结果 | |--------|------| | `soffice --headless --convert-to pdf` docx→pdf | ✅ | | `pandoc docx -o md` | ✅ | | `pdftoppm` pdf→png | ✅ | | `markitdown` 读取 docx/pptx | ✅ | | `python-docx` / `python-pptx` | ✅ | | Node `docx-js` 生成 docx | ✅ | | Node `pptxgenjs` 生成 pptx | ✅ | | ImageMagick 图片裁剪 | ✅ | | matplotlib 生成中文字体表格图片 | ✅ | | tesseract OCR 中英文 | ✅(可运行,中文识别准确度一般) | | chromium 网页截图 | ✅ | | `pdf2image` PDF 转图片 | ✅ | | docx/pptx skill 脚本 import | ✅ | ### 遇到的问题与解决 1. **markitdown 读 docx 报 MissingDependencyException** - 原因:默认 `markitdown` 不包含 docx converter 的 `mammoth` 依赖 - 解决:改成 `markitdown[docx]` 2. **Node 全局安装的 `docx`/`pptxgenjs` require 不到** - 原因:node 默认不搜索 `/usr/lib/node_modules` - 解决:Dockerfile 添加 `ENV NODE_PATH="/usr/lib/node_modules"` 3. **chromium 运行时有 dbus 报错** - 不影响截图结果,属于 headless 环境下的常见警告 4. **ImageMagick 默认禁止 PDF 处理** - 解决:修改 `/etc/ImageMagick-6/policy.xml` 中 PDF 的 rights 为 `read|write` 5. **onnxruntime 启动警告** - 警告:`Unknown CPU vendor. cpuinfo_vendor value: 0` - 不影响功能,arm64 容器中的常见提示 ## 尚未完成的工作 1. **云端构建验证** - 当前只在本地 arm64 构建验证 - 需要在云端 x86_64 上实际构建 - 云端磁盘紧张(只剩 4GB),需先清理或分阶段构建 2. **精简镜像体积(可选)** - 2.9GB 较大,可考虑去掉 chromium/ffmpeg 做成"最小方案 B"(约 1.5GB) - 或保留完整方案 B,但需确保云端有足够空间 3. **react-icons / react / react-dom / sharp** - pptxgenjs skill 文档中提到图标生成需要这几个包 - 当前未预装,需要时可在运行时安装或后续加入镜像 - `sharp` 涉及原生编译,构建时间和失败风险较高 4. **更详细的内存压力测试** - 当前只做了简单并发测试 - 未测试大文件转换、长时间运行场景 5. **ImageMagick 安全策略复核** - 当前为支持 PDF 放宽了限制,需确认是否符合安全要求 ## 下一步建议 ### 推荐路径:分阶段上云端 1. **阶段一:精简必要包** - 去掉 chromium、ffmpeg、imagemagick、tesseract - 保留:libreoffice、pandoc、poppler-utils、node、npm、docx、pptxgenjs、字体、defusedxml、markitdown[docx] - 目标镜像约 1.3-1.5GB - 先验证 Office skill 能跑通 2. **阶段二:按需加回媒体能力** - 根据实际使用频率,决定是否加回 imagemagick、ffmpeg、chromium、tesseract 3. **阶段三:优化构建缓存** - 考虑把 apt 层拆成多个 RUN,便于失败后重试 - 云端构建时加 `--progress=plain` 便于排查 ## 关键命令 ```bash # 本地构建 cd /Users/jojo/Desktop/agents/正在修复中/agents docker build -f docker/terminal.Dockerfile -t my-agent-shell:local . # 本地测试容器 docker run -d --name agent-test-local my-agent-shell:local tail -f /dev/null # 验证基础依赖 docker exec agent-test-local bash -c "which soffice pandoc pdftoppm node npm convert ffmpeg chromium tesseract jq rg fdfind tree" # 验证 Python 包 docker exec agent-test-local bash -c "/opt/agent-venv/bin/python -c 'import defusedxml, markitdown, pytesseract, pdf2image'" # 验证 Node 包 docker exec agent-test-local bash -c "node -e 'require(\"docx\"); require(\"pptxgenjs\"); console.log(\"OK\")'" # 查看镜像大小 docker images my-agent-shell:local # 监控运行时内存 docker stats agent-test-local --no-stream ``` ## 重要约束 - **本地 arm64,云端 x86_64,禁止把本地构建的镜像上传到云端** - 云端磁盘只剩 4GB,必须清理或分阶段构建 - 云端内存 2GB,构建/运行需警惕 OOM - 云端网络差,大文件下载可能超时 ## 相关文件 - `docker/terminal.Dockerfile` - `docker/toolbox-requirements.txt` - 项目记忆:`cloud_server_disk_usage`(服务器磁盘现状)