背景信息
我有一个使用langchain 和Ollama 的Python 应用程序。在本地运行这个程序效果非常好,因为我的机器上运行着 Ollama 客户端。
我想要做的是在无服务器平台(例如 GCR)上托管这个应用程序,为了做到这一点,我需要容器化应用程序。这对于应用程序的 python 端来说很容易,但我正在努力让 Ollama 部分正确。
我需要运行 Ollama 客户端才能让 langchain 使用引擎,但我不知道如何正确执行此操作在 dockerfile 中。我尝试过多阶段构建并使用官方 Ollama docker 镜像并从源代码下载,所有这些最终都遇到了相同的问题;我将 Ollama 放到容器上,但如果我那么
RUN ollama serve
我就不能做任何其他事情,因为其余代码等待 Ollama 服务器完成。
我在运行服务器时也尝试过使用
nohup
命令,但是每当我尝试使用
ollama pull <model>
拉取模型时,它总是返回询问 Ollama 是否正在运行。我已经添加了等待,但它仍然不起作用。
我尝试使用 docker-compose.yml 文件,但我发现的示例没有满足我的需要。我尝试在 dockerfile 中使用多阶段构建来尝试首先构建 Ollama 服务器,然后在第二阶段使用它,但这会导致与在一个阶段中构建它相同的问题。
我尝试使用启动脚本并使用这些作为让容器运行的入口点,但最终会出现相同的错误,即 Ollama 无法启动并且我无法提取图像。
问题
-
我的第一个问题是:是否有可能实现我想做什么?将此类应用程序托管在可以安装所需软件的虚拟机上会更好吗?
-
我的第二个问题是:如果可能的话,是否有人做过类似的事情,可以提供一些启示或建议?
对此的任何建议或帮助将不胜感激!
当然可以,以下是如何在 Docker 容器中使用 Ollama 和 LangChain 构建 Python 应用程序的方法。关键是让 Ollama 作为后台服务运行,然后让你的 Python 应用与其交互。
Dockerfile
FROM python:3.10
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
# 安装 Ollama(使用你想要的版本替换)
RUN curl -L https://github.com/jbarham/ollama/releases/download/v0.3.10/ollama-linux-amd64.tar.gz | tar xz -C /usr/local/bin
# 为模型创建一个目录
RUN mkdir /ollama
# 将 Ollama 数据目录设置为 /ollama
ENV OLLAMA_DIR=/ollama
# 将 Ollama 作为后台服务运行
CMD ["ollama", "serve", "&"]
# 设置工作目录
WORKDIR /app
# 复制应用程序依赖
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r requirements.txt
# 复制应用程序代码
COPY . .
# 设置应用程序的入口点(替换为你的主脚本)
CMD ["python", "your_app.py"]
说明:
-
基础镜像: 我们从包含 Python 3.10 的
python:3.10
基础镜像开始。 -
系统依赖: 我们安装
curl
(用于下载 Ollama),并且为了保持整洁,清理了 apt 缓存。 -
安装 Ollama:
- 我们从 GitHub 版本下载 Ollama 二进制文件(使用你想要的版本更新 URL)。
-
我们使用
tar
将其解压到/usr/local/bin
中,使之可在系统范围内访问。 -
模型目录: 我们为 Ollama 模型创建一个目录(
/ollama
)。这将是存储模型的地方。 -
环境变量: 我们设置
OLLAMA_DIR=/ollama
,告诉 Ollama 在哪里存储其数据和模型。 -
运行 Ollama 服务器:
-
CMD ["ollama", "serve", "&"]
以后台进程的形式启动 Ollama 服务器(&
)。这确保它不会阻止后续命令。 -
应用程序设置: 剩余步骤设置 Python 环境并将你的应用程序代码复制到容器中,这与标准 Python Dockerfile 相同。
构建和运行:
-
构建 Docker 镜像:
bash docker build -t my-ollama-app .
-
运行容器:
bash docker run -p 5000:5000 -it my-ollama-app
这将在主机上的端口 5000 上公开 Ollama,并在容器内启动你的应用程序。
在你的 Python 代码(
your_app.py
)中:
from langchain.llms import Ollama
from langchain import PromptTemplate, LLMChain
# 在初始化 Ollama 时,无需指定 base_url,因为它在同一个容器中运行
llm = Ollama(model="llama2")
# 现在你可以使用 Ollama 和 LangChain
其他注意事项:
-
模型下载:
第一次运行容器时,你需要使用
docker exec -it <container_id> ollama pull llama2
等命令来拉取你想要的 Ollama 模型。 -
持久化模型:
如果你想在容器重新启动后保留已下载的模型,请考虑使用 Docker 卷将
/ollama
目录挂载到主机上。
此设置允许你的 Python 应用程序与在同一个 Docker 容器内的 Ollama 服务器无缝通信。这让部署到 GCR 或其他无服务器平台变得更加容易。
标签:python,docker,dockerfile,ollama From: 78522325