【问题标题】:Connection Unavailable : Trying to connect locally hosted Neo4j from docker app连接不可用:尝试从 docker 应用程序连接本地托管的 Neo4j
【发布时间】:2021-06-16 07:57:31
【问题描述】:

我有一个 neo4j 数据库 https://localhost:7474 (https://localhost:7474),我通过 py2neo 的图形对象 ("bolt://127.0.0.1:7687") 连接它。如果不在 Docker 环境中,一切正常。现在我想做的是连接到我的应用程序(使用 fastpi:https://fastapi.tiangolo.com/deployment/docker/ 构建)。

我的问题是如何通过 docker 中托管的 docker image (fastapi) 图像连接到本地托管(在我的 mac)neo4j db。

但是我得到以下错误:

 docker run e7bf302e02ec


Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 742, in acquire
    cx = self._free_list.popleft()
IndexError: pop from an empty deque

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/wiring.py", line 162, in open
    s.connect(address)
ConnectionRefusedError: [Errno 111] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py", line 212, in open
    wire = cls._connect(profile, on_broken=on_broken)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py", line 228, in _connect
    wire = Wire.open(profile.address, keep_alive=True, on_broken=on_broken)
  File "/usr/local/lib/python3.8/site-packages/py2neo/wiring.py", line 164, in open
    raise_from(WireError("Cannot connect to %r" % (address,)), error)
  File "<string>", line 3, in raise_from
py2neo.wiring.WireError: Cannot connect to IPv4Address(('127.0.0.1', 7687))

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/uvicorn", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 362, in main
    run(**kwargs)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 386, in run
    server.run()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py", line 49, in run
    loop.run_until_complete(self.serve(sockets=sockets))
  File "/usr/local/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py", line 56, in serve
    config.load()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py", line 308, in load
    self.loaded_app = import_from_string(self.app)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/importer.py", line 20, in import_from_string
    module = importlib.import_module(module_str)
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "./app/main.py", line 8, in <module>
    from .database import Base
  File "./app/database.py", line 28, in <module>
    Base = Graph(DATABASE_URL, auth=(DATABASE_USERNAME, DATABASE_PASSWORD))
  File "/usr/local/lib/python3.8/site-packages/py2neo/database/__init__.py", line 358, in __init__
    self.service = GraphService(profile, **settings)
  File "/usr/local/lib/python3.8/site-packages/py2neo/database/__init__.py", line 189, in __init__
    self._connector = Connector(profile, **connector_settings)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 893, in __init__
    self.add_pools(self._profile)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 913, in add_pools
    pool = ConnectionPool.open(
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 570, in open
    seeds = [pool.acquire() for _ in range(init_size or cls.default_init_size)]
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 570, in <listcomp>
    seeds = [pool.acquire() for _ in range(init_size or cls.default_init_size)]
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 749, in acquire
    cx = self.connect()
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 706, in connect
    cx = Connection.open(self.profile, user_agent=self.user_agent,
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py", line 141, in open
    return Bolt.open(profile, user_agent=user_agent,
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py", line 223, in open
    raise_from(ConnectionUnavailable("Cannot open connection to %r" % profile), error)
  File "<string>", line 3, in raise_from
py2neo.client.ConnectionUnavailable: Cannot open connection to ConnectionProfile('bolt://neo4j@127.0.0.1:7687')

【问题讨论】:

  • Localhost 和 127.0.0.1 指的是您的主机,或者如果它在容器中,则指您的容器。你如何启动容器?你链接端口吗?
  • 我发出了 docker run -d --name mycontainer -p 80:80 myimage
  • 您的应用程序使用端口 80 吗?在 7474 端口?
  • 我已尝试使用 80:7474、7474:7474、80:7687、7687:7687。无法连接。有什么建议吗?
  • 您能否在您的问题中澄清一下,哪个服务是从哪里启动的以及如何启动的?比如,什么服务监听主机上的哪个端口等等。

标签: docker neo4j fastapi py2neo


【解决方案1】:

这似乎是docker 以及它是如何构建的问题。

基本上,如果您尝试从容器访问localhost,您将访问容器的本地主机,而不是您的计算机!

我们的想法是获取网络的 docker 容器的 ip 地址并使用该地址。

根据您所在的平台,这里有一些显示如何操作的链接(我正在考虑其他用户可能会找到此答案并依赖它)

localhost refuses connection with docker

How to access "http://localhost" from a Docker container in Windows?

【讨论】:

  • 这些答案的问题是很难自动化这个过程。最好利用 docker 的内置可能性,恕我直言,例如嵌入 dns 或端口映射。
  • 确实如此,但根据经验,您在服务器上设置了测试,并且这些天在极少数情况下需要在本地计算机上测试所有内容。不过,可以使用一个小脚本来检测 IP 地址并配置 docker 容器。无论如何,请随时通过提供支持自动化流程的教程链接来改进我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2021-03-17
  • 2018-12-01
  • 2021-02-10
相关资源
最近更新 更多