Docker容器中Ollama模型拉取服务异常退出及部署方案咨询
问题分析与解决方案
核心问题拆解
- 退出码0的本质:
ollama-models-pull是一次性任务服务,执行完成后正常退出(退出码0代表执行成功),这本身不是异常。但如果模型实际未拉取成功,问题出在拉取命令的写法上。 - 容器通信错误:在Docker Compose自定义网络中,容器间通信应使用服务名
ollama,而非指向宿主机的host.docker.internal。 - 命令逻辑缺陷:原命令中两个
curl并行执行,且未适配Ollama API的流式响应特性,可能导致拉取未完成就提前终止。
修正后的完整docker-compose.yml配置
services: ollama: container_name: ollama_v2 image: ollama/ollama:latest restart: unless-stopped volumes: - "./ollamadata:/root/.ollama" # 持久化模型与数据 ports: - "11434:11434" healthcheck: test: ["CMD", "ollama", "list"] interval: 10s timeout: 30s retries: 5 start_period: 10s networks: - ollama_network ollama-models-pull: container_name: ollama-models-pull image: ollama/ollama:latest # 改用Ollama官方镜像拉取,更稳定 depends_on: ollama: condition: service_healthy volumes: - "./ollamadata:/root/.ollama" # 共享存储卷,模型直接存入持久化目录 command: > sh -c " ollama pull mistral:latest && ollama pull nomic-embed-text " networks: - ollama_network chatbot: container_name: chatbot_v2 build: context: ./ dockerfile: Dockerfile restart: unless-stopped environment: - API_URL=http://ollama:11434 # 改用服务名访问Ollama ports: - "8501:8501" depends_on: ollama-models-pull: condition: service_completed_successfully networks: - ollama_network networks: ollama_network: driver: bridge
关键修改说明
- 替换模型拉取方式:放弃curl调用API,直接用Ollama官方镜像的
ollama pull命令,避免流式响应适配问题,拉取逻辑更可靠。 - 修复容器通信地址:将所有容器内的Ollama访问地址从
host.docker.internal改为服务名ollama,符合Docker Compose容器间通信规则。 - 串行执行拉取命令:用
sh -c和&&确保第一个模型拉取完成后,再执行第二个,避免并行拉取导致的资源竞争。
验证步骤
- 启动服务:
docker-compose up -d - 检查模型拉取结果:
docker exec ollama_v2 ollama list,输出应包含mistral:latest和nomic-embed-text - 验证聊天机器人:访问服务器的
8501端口,确认可正常调用模型
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

