如何将大模型镜像和 Ollama 镜像打包在一个 Docker 镜像中
最近工作中有个需求是将ollama和大模型一起打成一个镜像部署,将自己的操作步骤分享给大家。将大模型与 Ollama 服务打包在同一个 Docker 镜像中,可以简化部署流程并确保环境一致性。下面详细介绍实现步骤。
准备工作
首先需要准备以下内容:
-
已有的 Ollama 基础镜像(如
ollama/ollama:latest
) -
大模型文件(如
.gguf
格式的量化模型),可以huggingface上下载对应的版本模型文件,地址:HuggingFace官网 -
一个 Modelfile 用于定义模型参数
-
基础的 Linux 环境和 Docker 运行环境
构建步骤
1. 创建工作目录和文件结构
首先创建一个目录用于存放构建所需的文件:
mkdir ollama-model-bundle cd ollama-model-bundle
2. 准备 Modelfile
在目录中创建 Modelfile
,定义模型参数:
FROM /root/.ollama/models/qwen1_5-0_5b-chat-q5_k_m.gguf NAME qwen PARAMETER num_ctx 2048 PARAMETER temperature 0.7
3. 创建 Dockerfile
创建 Dockerfile
定义镜像构建过程:
# 基础镜像:使用Ollama官方镜像 FROM ollama/ollama:latest # 设置工作目录 WORKDIR /app # 复制模型文件到 Ollama 模型目录 COPY qwen1_5-0_5b-chat-q5_k_m.gguf /root/.ollama/models/qwen1_5-0_5b-chat-q5_k_m.gguf # 设置文件权限(确保 Ollama 可以读取) RUN chmod 644 /root/.ollama/models/qwen1_5-0_5b-chat-q5_k_m.gguf COPY Modelfile /root/.ollama/models/Modelfile RUN chmod 644 /root/.ollama/models/Modelfile COPY entrypoint.sh /app/entrypoint.sh # 设置文件权限 RUN chmod +x /app/entrypoint.sh # 设置环境变量(如果需要) ENV PATH="/usr/local/bin:$PATH" # 设置入口点和默认命令 ENTRYPOINT ["/app/entrypoint.sh"] CMD ["serve"] # 暴露Ollama服务端口 EXPOSE 11434
entrypoint.sh的内容是创建启动大模型
示例:
#!/bin/bash set -e # 检查模型是否已存在,不存在则导入 if ! ollama list | grep -q "qwen1_5-chat"; thenecho "正在导入Qwen1_5模型..."ollama create qwen1_5-chat -f /root/.ollama/models/Modelfile fi # 启动Ollama服务 echo "启动Ollama服务..." exec ollama serve "$@"
4. 复制模型文件到构建上下文
将大模型文件(如 Qwen-0.6b.q8_0.gguf
)复制到当前目录:
cp /path/to/Qwen-0.6b.q8_0.gguf .
5. 构建 Docker 镜像
使用以下命令构建镜像:
docker build -t ollama-qwen:custom .
参数说明:
-
-t ollama-qwen:custom
:指定镜像标签为ollama-qwen
,版本为custom
-
.
:指定当前目录为构建上下文
6. 测试镜像
构建完成后,可以测试镜像是否正常工作:
docker run -d -p 11434:11434 ollama-qwen:custom
测试模型是否可用:
curl http://localhost:11434/api/tags
7. 保存镜像为文件
将构建好的镜像保存为 .tar
文件:
docker save -o ollama-qwen-custom.tar ollama-qwen:custom
注意事项
-
镜像大小控制:
-
大模型文件可能非常大(数 GB),导致镜像体积庞大
-
可以考虑使用多阶段构建或压缩技术减小镜像体积
-
例如,使用
docker export
和docker import
结合gzip
压缩:
docker save ollama-qwen:custom | gzip > ollama-qwen-custom.tar.gz
-
-
模型路径问题:
-
在 Modelfile 中使用绝对路径(如
/root/.ollama/models/qwen1_5-0_5b-chat-q5_k_m.gguf
) -
确保 Dockerfile 中的
COPY
命令与 Modelfile 中的路径一致
-
-
权限问题:
-
确保模型文件和 Modelfile 的权限设置正确(通常为 644)
-
如果遇到权限问题,可以在容器内使用
chown
命令更改文件所有者
-
-
模型预加载:
-
如果在 Dockerfile 中启用预加载(取消注释相关行),构建时间会增加
-
但可以减少容器首次启动时的等待时间
-
-
网络访问:
-
如果模型需要联网下载额外资源,确保容器有网络访问权限
-
可以在构建时添加
--network=host
参数
-
常见问题解决
-
模型加载失败:
-
检查 Modelfile 语法是否正确
-
确认模型文件路径在容器内是否正确
-
使用
docker logs <container_id>
查看详细错误信息
-
-
磁盘空间不足:
-
使用
df -h
检查磁盘空间 -
清理不必要的 Docker 镜像和容器:
docker system prune -a
-
考虑使用更大容量的磁盘或挂载点
-
-
性能问题:
-
如果模型运行缓慢,检查容器资源限制
-
可以通过
docker run
添加--cpus
和--memory
参数调整资源分配
-
通过以上步骤,你可以成功将大模型和 Ollama 服务打包在同一个 Docker 镜像中,并导出为可分发的文件。