如何將大模型鏡像和 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 鏡像中,并導出為可分發的文件。