繁体   English   中英

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

[英]Unable to connect to neo4j database on docker container with docker compose

这是我用于创建数据库容器的 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, 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)

好的,所以它可能不是最好的答案,但是对于遇到此问题的其他任何人,我能够通过在 main 的开头添加sleep(30)来解决它

您可以尝试创建网络并在您的服务中使用它。 像这样的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM