首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用docker compose连接到docker容器上的neo4j数据库

无法使用docker compose连接到docker容器上的neo4j数据库
EN

Stack Overflow用户
提问于 2020-11-12 01:41:42
回答 2查看 416关注 0票数 1

这是我用来创建数据库容器的docker-compose.yml。

代码语言:javascript
复制
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:

代码语言:javascript
复制
mongo_client = MongoClient(host="database_mongo")

我正在尝试执行类似于mongoDb的操作,以使用neo4j中的GraphDatabase连接到我的neo4j,如下所示:

代码语言:javascript
复制
url = "{scheme}://{host_name}:{port}".format(scheme = "bolt", host_name="database_neo4j", port = 7687)
baseNeo4j = GraphDatabase.driver(url, encrypted=False)

或者使用像这样的py2neo

代码语言:javascript
复制
neo_client = Graph(host="database_neo4j")

然而,这一切都还没有起作用,所以我不确定我是否使用了正确的语法,以便在docker中使用neo4j。我试了很多东西,到处找,但都找不到答案……

整个错误消息是:

代码语言:javascript
复制
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, auth=auth, **config)
etl_pipeline_1    |   File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py", line 359, in open
etl_pipeline_1    |     pool = BoltPool.open(address, auth=auth, 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", line 531, 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, timeout)
etl_pipeline_1    |   File "/usr/local/lib/python3.7/site-packages/neo4j/io/__init__.py", line 528, in opener
etl_pipeline_1    |     return Bolt.open(addr, auth=auth, 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)
EN

回答 2

Stack Overflow用户

发布于 2020-11-13 20:51:50

好吧,这可能不是最好的答案,但对于其他有这个问题的人来说,我可以通过在main的开头添加一个sleep(30)来解决它

票数 0
EN

Stack Overflow用户

发布于 2021-02-28 18:31:36

您可以尝试创建网络并在您的服务中使用它。如下所示:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64791458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档