You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过环境变量控制Docker Compose中Ollama使用的指定LLM模型

如何通过环境变量控制Docker Compose中Ollama使用的指定LLM模型

我来帮你解决这个问题,只需要对Docker Compose配置做几个关键修改,就能让Ollama自动根据LLM_MODEL_NAME环境变量下载并使用指定模型,确保你的Python应用启动时模型已经准备就绪。具体方案如下:

核心修改思路

  1. 让Ollama容器接收LLM_MODEL_NAME环境变量,明确要下载的模型
  2. 自定义Ollama的启动命令,先自动拉取目标模型(已存在则跳过),再启动Ollama服务
  3. 调整Python应用对Ollama的依赖条件,确保应用只在Ollama服务就绪且模型下载完成后启动

1. 修改Docker Compose配置

更新你的docker-compose.yml,主要调整ollama服务的配置,并优化依赖逻辑:

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:9200 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5

  pokemon_app:
    build: .
    container_name: pokemon_app
    ports:
      - "8000:8000"
    depends_on:
      elasticsearch:
        condition: service_healthy
      ollama:
        # 改为等待Ollama健康检查通过(模型下载完成+服务就绪)
        condition: service_healthy
    environment:
      LLM_MODEL_NAME: ${LLM_MODEL_NAME}
      ELASTICSEARCH_URL: ${ELASTICSEARCH_URL}
      OLLAMA_URL: ${OLLAMA_URL}
      LOG_LEVEL: DEBUG
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8000/healthcheck || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5

  ollama:
    image: ollama/ollama:latest  
    container_name: ollama
    volumes:
      - ollama:/root/.ollama
    ports:
      - "11434:11434"
    # 传入模型名环境变量
    environment:
      - LLM_MODEL_NAME=${LLM_MODEL_NAME}
    # 自定义启动命令:先拉取模型(已存在则忽略错误),再启动Ollama服务
    command: ["sh", "-c", "ollama pull ${LLM_MODEL_NAME} || true && ollama serve"]
    healthcheck:
      # 健康检查:既要确保Ollama服务正常,也要验证模型已下载
      test: ["CMD-SHELL", "curl -f http://localhost:11434 && ollama list | grep -q ${LLM_MODEL_NAME} || exit 1"]
      interval: 60s  # 大模型下载慢,延长检查间隔
      timeout: 15s
      retries: 20    # 增加重试次数,给足够的下载时间

volumes:
  esdata:
    driver: local
  ollama:
    driver: local

2. 设置环境变量默认值

在项目根目录创建.env文件,添加默认的模型名和其他环境变量(方便本地开发):

# 默认使用Llama 3模型,可替换为Ollama支持的任意模型(如mistral、phi3等)
LLM_MODEL_NAME=llama3
ELASTICSEARCH_URL=http://elasticsearch:9200
OLLAMA_URL=http://ollama:11434

3. 启动与测试

方式1:使用默认模型启动

直接执行以下命令,Ollama会自动下载.env中指定的模型:

docker-compose up -d --build

方式2:临时指定其他模型启动

不需要修改.env,直接通过环境变量覆盖默认值:

# 比如使用Mistral模型启动
LLM_MODEL_NAME=mistral docker-compose up -d --build

关键细节说明

  • ollama pull的阻塞特性ollama pull命令会阻塞直到模型下载完成,因此在启动ollama serve前执行它,能确保模型完全就绪后才对外提供服务。
  • || true的作用:如果模型已经通过之前的下载保存在本地卷中,ollama pull会返回非0状态码,加上|| true可以避免容器因这个错误而启动失败。
  • 健康检查的增强:修改后的健康检查同时验证Ollama服务可用性和模型存在性,确保Python应用只有在所有依赖都完全就绪后才启动,避免因模型未准备好导致的运行时错误。
  • 模型持久化:因为Ollama的/root/.ollama目录挂载了本地卷,模型下载后会持久化存储,下次启动不会重复下载(除非模型有更新或卷被删除)。

备注:内容来源于stack exchange,提问作者KZiovas

火山引擎 最新活动