前幾天把自己的系統建置起來後,最好能做到把專案帶著走的程度,所以除了將專案推上 Github 之外,也可以用 compose 的方式打包
首先要來想想,我們在整個專案中總共用到哪些服務和必要依賴
Qdrant 官方提供 docker image 供我們立即使用,Ollama 有提供指令搞,會在 Dockerfile 中進行安裝,掛載 GPU 的部分,Docker-compose 有提供掛載顯卡的功能,最後則是 pip 套件的部分,則使用 pip freeze
指令輸出即可
再來就來組裝各個部件吧
由於工作目錄中並不是所有檔案都要複製到容器中,所以這邊我們寫一個 .dockerignore
避免多餘的檔案被複製到容器中
__pycache__/
venv/
saved_answer.csv
.env
dockerfile
Image 的部分我們因為要執行 Python 所以就不使用 ubuntu-22.04 的映像了,直接使用別人包好的映像
同時我們也在這個容器中安裝 Ollama 方便直接做使用,這時就不使用主機的服務了
FROM python:3.10-slim
RUN apt update && apt install curl -y
RUN curl -fsSL https://ollama.com/install.sh | sh
RUN bash -c "ollama serve &" && \
sleep 5 && \
ollama pull gemma2
WORKDIR /home/app
COPY * ./
COPY .cache ./
RUN chown -R root:root /home/app/.cache
RUN pip3 install --no-cache-dir -r requirements.txt
CMD bash -c "ollama serve &" && \
python3 main.py
.docker_env
# ollama
OLLAMA_SERVER_URL=http://127.0.0.1:11434
OLLAMA_HOST=127.0.0.1
# qdrant
QDRANT_URL=http://172.16.0.11:6333
docker-compose.yaml
底下的 GPU device_ids 可以透過 nvidia-smi -L
取得
容器內的通訊我是使用 docker network 做溝通,而前面的 .docker_env
就是為了能讓 main-service
能與 qdrant-db
連線
services:
qdrant-db:
image: qdrant/qdrant:latest
networks:
shared-network:
ipv4_address: 172.16.0.11
environment:
TZ: "Asia/Taipei"
restart: unless-stopped
ports:
- "6333:6333"
volumes:
- "./qdrant_storage:/qdrant/storage:z"
main-service:
depends_on:
- qdrant-db
build:
context: .
dockerfile: dockerfile
environment:
TZ: "Asia/Taipei"
env_file: .docker_env
ports:
- "7860:7860"
networks:
shared-network:
ipv4_address: 172.16.0.12
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
device_ids: ["GPU-ab45ab7e-9a2a-6c22-d305-79dffdf1bf8c"] # GPU
networks:
shared-network:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/24
一切就緒後,就可以在終端執行 docker compose up
,並且在映像建置完成後即可以在瀏覽器中輸入 http://127.0.0.1:7860
確認服務是否有被起起來了~