无法在 docker 内使用 Pymilvus 连接 Milvus。 MilvusException:(代码=2,消息=无法连接到本地主机上的服务器:19530。超时)

问题描述 投票:0回答:2

我正在尝试使用 Pymilvus 连接到 Milvus 服务器。服务器已启动并正在运行,但我无法连接到它:MilvusException:(代码= 2,消息=无法连接到本地主机上的服务器:19530。超时)

我正在使用 docker compose 运行两者:

version: "3.5"

services:

  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.0
    networks:
      app_net:
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2022-03-17T06-34-49Z
    networks:
      app_net:
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
    command: minio server /minio_data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
  
  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.1.4
    networks:
      app_net:
        ipv4_address: 172.16.238.10
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    ports:
      - "19530:19530"
    depends_on:
      - "etcd"
      - "minio"


  fastapi:
    build: ./fastapi
    command: uvicorn app.main:app --host 0.0.0.0
    restart: always
    networks:
      app_net:
        ipv4_address: 172.16.238.12
    environment:
      MILVUS_HOST: '172.16.238.10'
    depends_on:
      - standalone
    ports:
      - "80:80"
    volumes:
      - pfindertest:/data/fast
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
      interval: 30s
      timeout: 20s
      retries: 3
  


networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1
    

volumes:
  pfindertest:  

Dockerfile

FROM python:3.8

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

COPY ./app /code/app

主.py

from fastapi import FastAPI
import uvicorn
from pymilvus import connections

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

connections.connect(
  alias="default", 
  host='localhost', 
  port='19530'
)

我收到以下错误:

milvus-1-fastapi-1  | Traceback (most recent call last):
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/pymilvus/client/grpc_handler.py", line 115, in _wait_for_channel_ready
milvus-1-fastapi-1  |     grpc.channel_ready_future(self._channel).result(timeout=3)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/grpc/_utilities.py", line 139, in result
milvus-1-fastapi-1  |     self._block(timeout)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/grpc/_utilities.py", line 85, in _block
milvus-1-fastapi-1  |     raise grpc.FutureTimeoutError()
milvus-1-fastapi-1  | grpc.FutureTimeoutError
milvus-1-fastapi-1  | 
milvus-1-fastapi-1  | During handling of the above exception, another exception occurred:
milvus-1-fastapi-1  | 
milvus-1-fastapi-1  | Traceback (most recent call last):
milvus-1-fastapi-1  |   File "/usr/local/bin/uvicorn", line 8, in <module>
milvus-1-fastapi-1  |     sys.exit(main())
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1130, in __call__
milvus-1-fastapi-1  |     return self.main(*args, **kwargs)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1055, in main
milvus-1-fastapi-1  |     rv = self.invoke(ctx)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1404, in invoke
milvus-1-fastapi-1  |     return ctx.invoke(self.callback, **ctx.params)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 760, in invoke
milvus-1-fastapi-1  |     return __callback(*args, **kwargs)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 404, in main
milvus-1-fastapi-1  |     run(
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 569, in run
milvus-1-fastapi-1  |     server.run()
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py", line 60, in run
milvus-1-fastapi-1  |     return asyncio.run(self.serve(sockets=sockets))
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/asyncio/runners.py", line 44, in run
milvus-1-fastapi-1  |     return loop.run_until_complete(main)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
milvus-1-fastapi-1  |     return future.result()
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py", line 67, in serve
milvus-1-fastapi-1  |     config.load()
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py", line 474, in load
milvus-1-fastapi-1  |     self.loaded_app = import_from_string(self.app)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/importer.py", line 21, in import_from_string
milvus-1-fastapi-1  |     module = importlib.import_module(module_str)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
milvus-1-fastapi-1  |     return _bootstrap._gcd_import(name[level:], package, level)
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap_external>", line 843, in exec_module
milvus-1-fastapi-1  |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
milvus-1-fastapi-1  |   File "/code/./app/main.py", line 11, in <module>
milvus-1-fastapi-1  |     connections.connect(
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/pymilvus/orm/connections.py", line 262, in connect
milvus-1-fastapi-1  |     connect_milvus(**kwargs, password=password)
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/pymilvus/orm/connections.py", line 233, in connect_milvus
milvus-1-fastapi-1  |     gh._wait_for_channel_ready()
milvus-1-fastapi-1  |   File "/usr/local/lib/python3.8/site-packages/pymilvus/client/grpc_handler.py", line 118, in _wait_for_channel_ready
milvus-1-fastapi-1  |     raise MilvusException(Status.CONNECT_FAILED, f'Fail connecting to server on {self._address}. Timeout')
milvus-1-fastapi-1  | pymilvus.exceptions.MilvusException: <MilvusException: (code=2, message=Fail connecting to server on localhost:19530. Timeout)>
milvus-1-fastapi-1 exited with code 1

Milvus 服务器似乎正在工作,所以这不是问题。

NAME                 COMMAND                  SERVICE             STATUS              PORTS
milvus-1-fastapi-1   "uvicorn app.main:ap…"   fastapi             restarting             0.0.0.0:80->80/tcp
milvus-etcd          "etcd -advertise-cli…"   etcd                running             2379-2380/tcp
milvus-minio         "/usr/bin/docker-ent…"   minio               running (healthy)   9000/tcp
milvus-standalone    "/tini -- milvus run…"   standalone          running             0.0.0.0:9091->9091/tcp, 0.0.0.0:19530->19530/tcp

如果这很重要的话,我正在 Mac 上运行 Docker。我尝试使用 gitpod.io 但错误仍然存在。

docker docker-compose fastapi etcd milvus
2个回答
1
投票

使用 pymilvus==2.2.0 有效

从 pymilvus 导入( 连接, 公用事业, 字段架构, 集合架构, 数据类型, 收藏, ) 连接.connect(“默认”,主机=“localhost”,端口=“19530”)

打印(“已连接...”)


0
投票

对我来说以下解决方案有效:

  1. 使用容器的IP地址:

    • 通过
      docker inspect milvus_container_name
      获取 Milvus 容器的 IP 地址。
    • 修改您的 Streamlit 连接字符串以显式使用此 IP(例如,
      "milvus://<container_ip>:19530"
      )。
  2. Docker 网络:

    • 如果您的 Streamlit 和 Milvus 容器驻留在不同的 Docker 网络上,请解决此问题:
      • 默认桥接网络:确保两个容器都是默认桥接网络的一部分。
      • 自定义网络:创建自定义网络(例如,
        docker network create my_network
        )并将两个容器连接到它。

说明:

Docker 容器在自己的网络命名空间内运行。这些潜在原因的解决如下:

  • IP 地址: 使用 IP 直接回避容器化环境中可能出现的 DNS 解析问题。
  • 网络:在容器之间建立适当的通信对于分布式应用程序至关重要。
© www.soinside.com 2019 - 2024. All rights reserved.