Docker部署Ollama+Python聊天Bot遇域名解析错误的排查求助
问题描述
使用Python 3.10.10开发的本地聊天机器人,计划通过Docker Compose部署到服务器,依赖的Python包如下:
chromadb==0.5.3 streamlit==1.36.0 langchain_core==0.2.9 langchain_community==0.2.5 PyPDF2 pypdf==4.2.0
同时依赖Python 3.10.10、Ollama、Mistral:latest模型和nomic-embed-text:latest嵌入模型。
Dockerfile设置环境变量与启动命令:
ENV BASE_URL=http://ollama:11434 CMD ["streamlit", "run", "chatbot.py", "--server.port=8501", "--server.address=0.0.0.0"]
Docker Compose配置:
version: '3.8' services: ollama: image: ollama/ollama:latest # Use the official Ollama image container_name: ollama ports: - "11434:11434" command: > ollama pull nomic-embed-text:latest && ollama pull mistral:latest && ollama serve # command: serve # Simplify the command to just serve models available environment: - MODELS=nomic-embed-text:latest,mistral:latest chatbot: build: . container_name: chatbot environment: BASE_URL: http://ollama:11434 ports: - "8501:8501" depends_on: - ollama
执行docker-compose up --build后,访问http://localhost:8501出现错误:
ValueError: Error raised by inference endpoint: HTTPConnectionPool(host='ollama', port=11434): Max retries exceeded with url: /api/embeddings (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f9a613b0d60>: Failed to resolve 'ollama' ([Errno -3] Temporary failure in name resolution)"))
外部访问http://localhost:11434显示Ollama正常运行,本地直接运行聊天机器人代码无问题。
错误原因
- 容器启动顺序与服务就绪不同步:
depends_on仅保证chatbot容器在ollama容器之后启动,但不等待ollama服务完全就绪。ollama容器启动后会先执行模型拉取操作,该过程耗时较长,此时chatbot已启动并尝试连接ollama,可能遇到DNS解析延迟或服务未就绪的情况。 - Docker DNS解析延迟:在ollama容器启动初期,其网络别名(服务名
ollama)可能还未完全注册到Docker内置DNS服务,导致chatbot容器无法解析该主机名。
解决方案
方案1:给ollama添加健康检查,确保服务就绪后再启动chatbot
修改Docker Compose配置,为ollama服务添加健康检查,让chatbot仅在ollama服务健康后启动:
version: '3.8' services: ollama: image: ollama/ollama:latest container_name: ollama ports: - "11434:11434" command: > ollama pull nomic-embed-text:latest && ollama pull mistral:latest && ollama serve environment: - MODELS=nomic-embed-text:latest,mistral:latest healthcheck: test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"] interval: 10s timeout: 5s retries: 10 start_period: 30s # 预留模型拉取的初始化时间 chatbot: build: . container_name: chatbot environment: BASE_URL: http://ollama:11434 ports: - "8501:8501" depends_on: ollama: condition: service_healthy # 等待ollama服务健康
方案2:在chatbot启动前等待ollama服务可用
在chatbot的Dockerfile中添加等待逻辑,确保ollama服务就绪后再启动streamlit:
修改Dockerfile:
FROM python:3.10.10-slim # 安装curl用于检测服务状态 RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV BASE_URL=http://ollama:11434 # 循环检测ollama服务,可用后启动应用 CMD ["sh", "-c", "until curl -f $BASE_URL/api/tags; do sleep 5; done && streamlit run chatbot.py --server.port=8501 --server.address=0.0.0.0"]
方案3:显式创建Docker网络
显式指定网络可避免潜在的网络隔离问题,确保两个容器在同一网络内:
version: '3.8' networks: chatbot-network: driver: bridge services: ollama: image: ollama/ollama:latest container_name: ollama ports: - "11434:11434" command: > ollama pull nomic-embed-text:latest && ollama pull mistral:latest && ollama serve environment: - MODELS=nomic-embed-text:latest,mistral:latest networks: - chatbot-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"] interval: 10s timeout: 5s retries: 10 start_period: 30s chatbot: build: . container_name: chatbot environment: BASE_URL: http://ollama:11434 ports: - "8501:8501" depends_on: ollama: condition: service_healthy networks: - chatbot-network
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

