
本文介绍通过 docker 容器化方式将 ollama 及其模型(如 llama3.2/3.3)完整嵌入 python 应用,实现用户零配置安装——无需单独部署 ollama 服务,真正开箱即用。
本文介绍通过 docker 容器化方式将 ollama 及其模型(如 llama3.2/3.3)完整嵌入 python 应用,实现用户零配置安装——无需单独部署 ollama 服务,真正开箱即用。
Ollama 本身是一个独立的系统级服务(非纯 Python 库),无法像 Tesseract-OCR 那样通过简单复制二进制文件或静态链接实现“直接打包”。其依赖底层操作系统支持(如 Linux 的 cgroups、macOS 的虚拟化框架)、运行时守护进程(ollama serve)、模型缓存管理及 HTTP API 服务,因此传统 package_data 或 include_files 方式在跨平台场景下极易失败。
✅ 推荐方案:Docker 多阶段容器化封装
这是目前唯一稳定、可复现、跨平台(Linux/macOS/Windows with Docker Desktop)的集成路径。核心思路是构建一个自包含镜像:内建 Ollama 运行时 + 预加载指定模型 + 嵌入 Python 应用 + 自动启动服务链。
以下为完整实践步骤:
-
编写
Dockerfile(示例基于 Ubuntu,兼容主流架构):# 使用官方 Ollama 基础镜像(轻量且已预装 ollama CLI) FROM ollama/ollama:latest
安装 Python 3.11+ 及 pip(Ollama 镜像默认不含 Python)
RUN apt-get update && apt-get install -y python3.11 python3.11-venv python3.11-dev curl && \ ln -sf /usr/bin/python3.11 /usr/bin/python && \ ln -sf /usr/bin/pip3.11 /usr/bin/pip
创建应用目录并复制代码
WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt
复制 Python 主程序(如 app.py)及资源
COPY . .
预拉取并保存模型(确保离线可用;llama3.2 是 alias,实际拉取最新 3.2.x)
RUN ollama pull llama3.2 && \ ollama tag llama3.2 myapp/llama3.2
暴露 Ollama 默认端口(11434)供 Python 应用内部调用
EXPOSE 11434
启动脚本:后台运行 ollama serve,再启动 Python 应用
COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
2. **创建 `entrypoint.sh`**(确保服务顺序可靠):
```bash
#!/bin/sh
# 后台启动 Ollama 服务(-d 表示 daemon 模式)
ollama serve &
OLLAMA_PID=$!
# 等待 Ollama API 就绪(最大等待 30 秒)
timeout 30s bash -c 'until curl -sf http://localhost:11434/ > /dev/null; do sleep 1; done' || {
echo "❌ Ollama failed to start within timeout"; exit 1
}
# 启动你的 Python 应用(自动连接本地 Ollama)
exec python app.py
-
Python 应用中调用(无需修改 URL):
import requests
def query_llama3(prompt: str): response = requests.post( "https://www.php.cn/link/d6d62b622eb67e996d9bdf9c539222cd", json={ "model": "myapp/llama3.2", # 使用预加载的别名 "messages": [{"role": "user", "content": prompt}], "stream": False } ) return response.json()["message"]["content"]
print(query_llama3("Hello, who are you?"))
⚠️ 关键注意事项: - **不可直接打包 Ollama 二进制到 `site-packages`**:Ollama 不是库而是服务,需进程级隔离与持久化存储(如 `~/.ollama`),Docker 提供了天然沙箱; - **Windows/macOS 用户必须安装 Docker Desktop**:这是跨平台一致性的前提; - **模型体积较大(llama3.2 约 4.7GB)**:建议在 `docker build` 阶段预拉取,避免用户首次运行时网络卡顿; - **生产环境建议添加健康检查**:在 `Dockerfile` 中加入 `HEALTHCHECK` 指令监控 `/api/tags` 端点; - **若需 GUI 或桌面分发**:可进一步用 `pyinstaller` 打包轻量 Python 启动器,通过 `subprocess` 调用 `docker run`,实现一键双击体验。 总结:虽然比集成 Tesseract 更复杂,但 Docker 方案提供了工业级可靠性、版本锁定能力与环境一致性——这才是面向终端用户的正确封装范式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











