将python项目从windows部署到Docker 目录1. 编导出requirements.txt2. 编写适配 LangChain Celery 的 Dockerfile2.1 创建一个 Dockerfile2.2 编写 docker-compose.yml2.3 修改代码连接redis的编码2.4 关于工作目录2.5 关于多容器架构3. 构建与运行(需要先安装好Docker)4. 运行容器5. Frist. 安装Docker步骤Windows 版5.1 Docker 引擎和 Docker Compose 必须安装在 Windows 操作系统上绝对不能安装在 Conda 环境里。在langchain-conda-env 环境Conda编码的项目以下是具体的操作步骤第一步从 Conda 环境中导出依赖在你的 Windows 电脑上激活你的 Conda 环境并生成依赖文件1. 导出requirements.txt(1).激活你的 LangChain 环境conda activate langchain-conda-env(2). 将当前环境的所有包及精确版本号导出为 requirements.txtpip freeze requirements.txt注强烈建议在导出的 requirements.txt 中锁定具体版本例如 langchain0.3.0这能确保 Docker 里的环境与你的本地环境 100% 一致避免隐式依赖冲突。然后去C:\Windows\System32 文件夹里面找到requirements文件将其剪切到项目根目录里面防止后续找不到。2. 编写适配 LangChain Celery 的 Dockerfile由于项目涉及 LangChain 和 Celery 多进程我们可以直接使用官方的轻量级 Python 镜像作为基础。第一步创建 Dockerfile# 1. 使用 slim 版本的官方 Python 镜像体积小且兼容性好Python 版本保持 3.11 FROM python:3.11-slim # 2. 设置工作目录相当于在容器内执行 mkdir /app cd /app WORKDIR /app # 3. 复制依赖文件并安装利用 Docker 分层缓存加速后续构建 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 4. 复制整个项目的代码到容器内 COPY . .第二步编写 docker-compose.yml在你的项目根目录和 Dockerfile 同级新建一个文件叫 docker-compose.yml。这是整个方案的灵魂。# 它告诉 Docker 引擎“请按照 3.8 版本的语法规则来解读这个 YAML 文件”。 version: 3.8 services: # --- 服务 1Redis (作为消息中间件) 6379是 Redis 的默认标准端口--- redis: image: redis:alpine ports: - 6379:6379 # 左边是宿主机端口右边是容器内部端口 # --- 服务 2Web 应用 (对外提供服务) --- web: build: . # 使用当前目录的 Dockerfile 构建镜像 command: python main.py --mode web --no-debug # 【关键点】指定 Web 的启动命令 ports: - 8000:5000 # 容器内部端口由你的代码决定 # Python 代码里写的是 app.run(port5000) 或者启动命令是 --port 5000。那么容器内部的端口必须是 5000。 # 宿主机端口由你决定随便定 # 这是你浏览器访问时用的端口。你可以把它映射成 8000也可以映射成 5000甚至 9999. environment: # 关键在这里告诉 Python 代码Redis 的地址是 redis:6379 - REDIS_URLredis://redis:6379/0 depends_on: - redis # 等 redis 起来了再启动 web environment: - CELERY_BROKER_URLredis://redis:6379/0 # 告诉代码去哪里找队列 # --- 服务 3Celery Worker (后台干活的) --- worker: build: . # 【重点】使用完全相同的 Dockerfile 构建 command: celery -A celery_app.celery_app worker --loglevelinfo # 【关键点】指定 Worker 的启动命令 depends_on: - redis # 必须依赖 redis environment: - CELERY_BROKER_URLredis://redis:6379/0 # 连接同一个 redis第三步如果你的 Python 代码里硬编码了 host‘localhost’ 来连 Redis在 Docker 里会报错必须改成 host‘redis’即服务名因为容器之间是通过服务名互相访问的而不是 localhost。修改celery.py文件如下.“工作目录”到底是什么在 Docker 的世界里WORKDIR /app 并不是指电脑上的 E:\FileData\python_project\AI_RAG_Answer。它指的是 Docker 容器内部那个即将生成的 Linux 小系统里的一个文件夹路径。你的电脑宿主机文件在 E:…\AI_RAG_AnswerDocker 容器目标环境WORKDIR /app 相当于在容器里执行了mkdir /app然后cd /app。所以/app 是容器里的绝对路径和你电脑上的盘符没有任何关系。关于第二步多容器架构是迈向生产级部署的关键一步。这不仅是 Docker 的最佳实践也是未来你如果想上 Kubernetes (K8s) 或者使用云服务的必经之路。这种架构的核心思想叫做“单一职责原则”Web 容器只负责处理用户的 HTTP 请求API 接口。Worker 容器只负责在后台默默干活跑异步任务、发邮件、处理数据。虽然它们是两个独立的进程运行在两个独立的容器里但神奇的是它们共享同一份代码和同一个 Redis 消息队列。为什么这样做多容器架构更好 1. 独立伸缩省钱/高性能如果用户访问量很大你可以启动 5 个 Web 容器如果后台任务堆积了你可以启动 10 个 Worker 容器。互不干扰。 2. 故障隔离如果 Worker 因为处理一个超大数据把内存撑爆了它只会重启自己不会导致你的网站挂掉。 3. 日志清晰看 Web 日志就是纯请求记录看 Worker 日志就是纯任务执行记录排查问题极其方便。3. 构建与运行这一步需要先安装docker。在项目根目录下执行以下命令即可将你的 Conda 项目转化为标准的 Docker 容器# 构建镜像docker build -t my-langchain-celery-app .4. 运行容器这里以后台模式运行docker run -d --name langchain-worker my-langchain-celery-app 进阶优化建议针对大模型应用如果你的 LangChain 项目中使用了向量数据库或特定的本地模型建议在 Dockerfile 中加入以下最佳实践非 Root 用户运行出于安全考虑生产环境应避免使用 root 权限运行 AI 服务。可以在 Dockerfile 中添加创建用户的指令dockerfile编辑ARG USER_ID1000RUN useradd -m -u ${USER_ID} appuser chown -R appuser:appuser /appUSER appuser处理系统级依赖LangChain 生态中某些库如解析 PDF 的库、OpenCV 等可能需要底层的 C/C 编译工具。如果遇到报错可以在 pip install 之前加上系统依赖的安装dockerfile编辑RUN apt-get update apt-get install -y --no-install-recommendsbuild-essential git curl rm -rf /var/lib/apt/lists/*环境变量注入像 OpenAI API Key 这样的敏感信息绝对不要硬编码在 Dockerfile 里。应该在运行容器时通过 -e 参数动态注入bash编辑docker run -d -e OPENAI_API_KEY“sk-xxx” my-langchain-celery-app通过这种方式你既摆脱了 Windows 下 Celery 无法多进程的痛点又完美复现了你的 langchain-conda-env 环境同时还获得了跨平台部署的能力5. 运行安装Docker步骤Windows 版Docker 引擎和 Docker Compose 必须安装在 Windows 操作系统上绝对不能安装在 Conda 环境里。既然你用的是 Windows最推荐的方式是直接安装 Docker Desktop。它是一个图形化软件安装好后会自动帮你配置好 Docker Engine 和 Docker Compose。WSL2 Windows分版本安装保姆级教程别再瞎装msi内核包了按系统对号入座100%成功https://blog.csdn.net/2602_94958286/article/details/159435017