一、背景官方 RAGFlow 提供了标准的 Docker 镜像infiniflow/ragflow:v0.25.0,但当我们对 Python 后端或 Web 前端进行了自定义修改(主要是DOC_ENGINE和关系数据库都换成seekdb)后,需要重新打包镜像。本文记录了从零开始构建自定义镜像lt/ragflow:0.25.0并成功部署的完整过程,包括踩过的所有坑和解决方案。二、环境准备项目版本/配置机型MacBook Pro 2019 16寸系统macOS (Darwin)CPUIntel x86_64 架构Python3.122.1 检查本地环境# 检查 Node.js 版本(需要 20.x)node--version# 输出: v20.19.6# 检查 Docker 版本docker--version# 输出: Docker version 29.1.3# 确认官方镜像已存在dockerimages|grepinfiniflow/ragflow# 输出: infiniflow/ragflow:v0.25.02.2 项目结构ragflow/ ├── api/ # Python 后端 API ├── rag/ # RAG 核心逻辑 ├── web/ # React 前端 ├── docker/ # Docker 配置 │ ├── docker-compose.yml │ ├── .env │ └── service_conf.yaml.template ├── Dockerfile # 官方 Dockerfile └── 9b5ad71b2ce5302211f9c61530b329a4922fc6a4 # tiktoken 缓存文件三、构建自定义镜像3.1 编译前端cd/path/to/ragflow/web# 安装依赖npminstall# 构建生产版本NODE_OPTIONS="--max-old-space-size=8192"npmrun build构建完成后,web/dist/目录包含编译后的静态文件。3.2 创建自定义 Dockerfile由于官方 Dockerfile 依赖网络下载模型文件,我们基于已有的官方镜像构建:# Dockerfile.custom FROM infiniflow/ragflow:v0.25.0 USER root WORKDIR /ragflow # 复制 Python 后端代码 COPY api/ /ragflow/api/ COPY rag/ /ragflow/rag/ COPY deepdoc/ /ragflow/deepdoc/ COPY agent/ /ragflow/agent/ COPY mcp/ /ragflow/mcp/ COPY common/ /ragflow/common/ COPY memory/ /ragflow/memory/ COPY conf/ /ragflow/conf/ COPY pyproject.toml uv.lock /ragflow/ # 复制编译好的前端 COPY web/dist/ /ragflow/web/dist/ # 复制 tiktoken 缓存文件(重要!) COPY 9b5ad71b2ce5302211f9c61530b329a4922fc6a4 /ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 # 复制入口脚本 COPY docker/entrypoint.sh /ragflow/entrypoint.sh RUN chmod +x /ragflow/entrypoint.sh # 复制 nginx 配置 COPY docker/nginx/ragflow.conf.python /etc/nginx/conf.d/ragflow.conf.python WORKDIR /ragflow ENTRYPOINT ["./entrypoint.sh"]3.3 构建镜像cd/path/to/ragflowdocker