用 Docker 把 Python AI 小工具装进盒子:一次构建,到处运行
用 Docker 把 Python AI 小工具装进盒子:一次构建,到处运行
很多 AI 小工具最初都是一个 Python 脚本:读一段文本,调用模型接口,输出摘要。本地跑没问题,换台机器就遇到 Python 版本、依赖冲突、环境变量丢失。Docker 的价值就在这儿:把脚本和运行环境一起打包,让“能跑”变成可复现的“到处能跑”。
下面用一个极简文本摘要工具演示。它通过环境变量读取 API Key 和接口地址,用 requests 调兼容 OpenAI 的接口。先看项目结构:
text
summarizer/
├── Dockerfile
├── requirements.txt
└── app .py
requirements.txt 只放必要依赖:
text
requests==2.32.3
app .py 核心逻辑如下,省略异常细节:
python
import os, sys, requests
api_key = os.environ[“AI_API_KEY”]
base_url = os.environ[“AI_BASE_URL”]
text = sys.stdin.read().strip()
resp = requests.post(
f"{base_url}/chat/completions",
headers={“Authorization”: f"Bearer {api_key}"},
json={
“model”: os.getenv(“AI_MODEL”, “gpt-4o-mini”),
“messages”: [
{“role”: “system”, “content”: “用三句话总结用户输入。”},
{“role”: “user”, “content”: text},
],
},
timeout=60,
)
resp.raise_for_status()
print(resp.json()[“choices”][0][“message”][“content”])
关键点是:密钥和接口地址不写进代码,也不写进镜像,运行时通过 -e 注入。接着写 Dockerfile:
dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app .py .
ENTRYPOINT [“python”, “app. py”]
构建和运行:
bash
docker build -t summarizer:0.1 .
echo “Docker 是一种轻量级容器技术……” |
docker run --rm -i
-e AI_API_KEY=“AI_BASE_URL”
summarizer:0.1
这里 -i 让容器接收标准输入,–rm 跑完自动删除容器。若你用的是宿主机上的本地模型服务,Linux 下不能直接写 localhost,因为容器里的 localhost 是容器自己。可以加:
bash
–add-host=host.docker.internal:host-gateway
-e AI_BASE_URL=“$LOCAL_AI_BASE_URL”
其中 LOCAL_AI_BASE_URL 由你在宿主机上设为本地模型服务的兼容接口地址。
第一个常见坑是镜像越建越大。开发阶段频繁改代码时,把依赖安装放在 COPY app .py 之前,能充分利用层缓存;生产镜像尽量用 slim 基础镜像,并加 .dockerignore 排除 .git、pycache、测试数据。第二个坑是密钥泄漏:不要用 ENV AI_API_KEY=… 写进 Dockerfile,因为镜像层可被查看;用运行时环境变量或 Docker secret。第三个坑是输出缓冲:容器里 Python 的 stdout 可能延迟,调试时可设 PYTHONUNBUFFERED=1。
这套模式可以复用到很多 AI 工具:换掉 app .py,就能封装 OCR、向量化、批量翻译或本地 RAG 脚本。Docker 不负责让模型更聪明,但它能让你少花时间在“为什么这台机器又跑不起来”上。先让工具可复现,再谈优化,是入门阶段最划算的一步。
- 点赞
- 收藏
- 关注作者
评论(0)