如何通过环境变量控制Docker Compose中Ollama使用的指定LLM模型
如何通过环境变量控制Docker Compose中Ollama使用的指定LLM模型
我来帮你解决这个问题,只需要对Docker Compose配置做几个关键修改,就能让Ollama自动根据LLM_MODEL_NAME环境变量下载并使用指定模型,确保你的Python应用启动时模型已经准备就绪。具体方案如下:
核心修改思路
- 让Ollama容器接收
LLM_MODEL_NAME环境变量,明确要下载的模型 - 自定义Ollama的启动命令,先自动拉取目标模型(已存在则跳过),再启动Ollama服务
- 调整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




