如何解决无法使用docker compose连接到docker容器上的neo4j数据库
这是我用来创建数据库容器的docker-compose.yml。
version: '3.7'
services:
application:
build:
context: ./app
dockerfile: dockerfile #dockerfile-prod
depends_on:
- database_mongo
- database_neo4j
- etl_pipeline
environment:
- flask_env=dev #flask_env=prod
volumes:
- ./app:/app
ports:
- "8080:8080" #- 8080:8080
database_mongo:
image: "mongo:4.2"
expose:
- 27017
volumes:
- ./data/database/mongo:/data/db
database_neo4j:
image: neo4j:latest
expose:
- 27018
volumes:
- ./data/database/neo4j:/data
ports:
- "7474:7474" # web client
- "7687:7687" # DB default port
environment:
- NEO4J_AUTH=none
etl_pipeline:
depends_on:
- database_mongo
- database_neo4j
build:
context: ./data/etl
dockerfile: dockerfile #dockerfile-prod
volumes:
- ./data/:/data/
- ./data/etl:/app/
我正在尝试使用python驱动程序连接到neo4j数据库。我已经可以通过以下这一行连接到mongoDb:
mongo_client = MongoClient(host="database_mongo")
我正在尝试执行类似于mongoDb的操作,以便通过neo4j中的GraphDatabase连接到我的neo4j,如下所示:
url = "{scheme}://{host_name}:{port}".format(scheme = "bolt",host_name="database_neo4j",port = 7687)
baseNeo4j = GraphDatabase.driver(url,encrypted=False)
或使用py2neo这样的
neo_client = Graph(host="database_neo4j")
但是,这一切都没有起作用,因此我不确定是否要使用正确的语法以便将neo4j与docker一起使用。我尝试了很多事情,环顾四周,但找不到答案...
整个错误消息是:
etl_pipeline_1 | MongoClient(host=['database_mongo:27017'],document_class=dict,tz_aware=False,connect=True)
etl_pipeline_1 | Traceback (most recent call last):
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 929,in _connect
etl_pipeline_1 | s.connect(resolved_address)
etl_pipeline_1 | ConnectionRefusedError: [Errno 111] Connection refused
etl_pipeline_1 |
etl_pipeline_1 | During handling of the above exception,another exception occurred:
etl_pipeline_1 |
etl_pipeline_1 | Traceback (most recent call last):
etl_pipeline_1 | File "main.py",line 26,in <module>
etl_pipeline_1 | baseNeo4j = GraphDatabase.driver(url,encrypted=False)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py",line 183,in driver
etl_pipeline_1 | return cls.bolt_driver(parsed.netloc,auth=auth,**config)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py",line 196,in bolt_driver
etl_pipeline_1 | return BoltDriver.open(target,line 359,in open
etl_pipeline_1 | pool = BoltPool.open(address,pool_config=pool_config,workspace_config=default_workspace_config)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 531,in open
etl_pipeline_1 | seeds = [pool.acquire() for _ in range(pool_config.init_size)]
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",in <listcomp>
etl_pipeline_1 | seeds = [pool.acquire() for _ in range(pool_config.init_size)]
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 545,in acquire
etl_pipeline_1 | return self._acquire(self.address,timeout)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 409,in _acquire
etl_pipeline_1 | connection = self.opener(address,line 528,in opener
etl_pipeline_1 | return Bolt.open(addr,timeout=timeout,routing_context=routing_context,**pool_config)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 198,in open
etl_pipeline_1 | keep_alive=pool_config.keep_alive,etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 1049,in connect
etl_pipeline_1 | raise last_error
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 1039,in connect
etl_pipeline_1 | s = _connect(resolved_address,timeout,keep_alive)
etl_pipeline_1 | File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py",line 943,in _connect
etl_pipeline_1 | raise ServiceUnavailable("Failed to establish connection to {!r} (reason {})".format(resolved_address,error))
etl_pipeline_1 | neo4j.exceptions.ServiceUnavailable: Failed to establish connection to IPv4Address(('172.29.0.2',7687)) (reason [Errno 111] Connection refused)
解决方法
好吧,也许这不是最好的答案,但是对于其他有此问题的人,我可以通过在main开头添加to_be_replaced = ['C11','C27','C2']
replace_with = ['C1','C16','C22','C6']
来解决此问题
您可以尝试创建网络并在您的服务中使用它。像这样:
networks:
neo4j_network:
driver: bridge
services:
neo4j:
image: neo4j:latest
expose:
- 27018
volumes:
- ./data/database/neo4j:/data
ports:
- "7474:7474" # web client
- "7687:7687" # DB default port
environment:
- NEO4J_AUTH=none
networks:
- neo4j_network
application:
build:
context: ./app
dockerfile: dockerfile #dockerfile-prod
depends_on:
- database_mongo
- database_neo4j
- etl_pipeline
environment:
- flask_env=dev #flask_env=prod
volumes:
- ./app:/app
ports:
- "8080:8080"
networks:
- neo4j_network
然后,对于您的 Neo4j 驱动程序 URL(在您的代码中),请确保使用 bolt://host.docker.internal:7687
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。