neo4j / neo4j-javascript-driver

Neo4j Bolt driver for JavaScript

Home Page:https://neo4j.com/docs/javascript-manual/current/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Connection refused in Docker Compose network

JonasHiltl opened this issue · comments

I have a Node.js application and Neo4j running through docker compose, they are in the same network so I thought I wouldn't encounter any issues. But the driver fails to connect to Neo4j. It works just fine without docker through localhost.

This is my bolt connection string: bolt://neo4j:7687.
neo4j is the name of the docker compose service and it just uses the ip address of the docker service.

This is the error message

Neo4jError: Failed to connect to server. Please ensure that your database is listening on the correct host and port and that you have compatible encryption settings both on Neo4j server and driver. Note that the default encryption setting has changed in Neo4j 4.0. Caused by: connect ECONNREFUSED 172.21.0.4:7687

As you can see in the error message (ECONNREFUSED 172.21.0.4:7687), docker successfully routes to the ip of the Neo4j container by just specifying the container name. So I'm unsure what could cause this connection issue.

This is the Neo4j docker service:

neo4j:
    image: neo4j:latest
    container_name: neo4j
    networks:
      - basenet
    ports:
      - 7474:7474
      - 7687:7687
    restart: on-failure
    volumes:
      - ./neo4j/plugins:/plugins
    environment:
      NEO4J_AUTH: neo4j/test
      NEO4J_dbms_logs_debug_level: DEBUG
      NEO4J_dbms.default_advertised_address: "0.0.0.0"
      NEO4J_dbms_connector_bolt_advertised__address: "0.0.0.0"

Hi, can you share the relevant Node.js code as well?
I personally do not use Compose very often, the only difference I see with one sample I have around is that I configure the "lan" network, not "basenet".

I'm using neogma as an orm which uses the js driver under the hood and I just pass the environment variables in the constructor of neogma.

import { Neogma } from 'neogma';

export const neogma = new Neogma({
  url: process.env.NEO4J_URL!,
  username: process.env.NEO4J_USER!,
  password: process.env.NEO4J_PASSWORD!,
});

Hi @JonasHiltl,

  • which operational system are you using?
  • if you're in macos or windows, how you docker is setup? Are you using docker desktop, minikube or other solution?
  • Is your application running the docker-compose environment or in the localhost?

Sorry for the late reply with a lot questions, but I'd like to understand the network/docker setup.

I'm using WSL 2 and using Docker Desktop. I have defined my applications in a docker-compose file. Below is the neo4j image and my Node application both running through docker-compose

version: "3.8"

services:
  profile:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - BUILD_CONTEXT=profile-service
    container_name: profile
    networks:
      - basenet
    depends_on:
      - neo4j
    ports:
      - 3001:3000
    volumes:
      - ./apps/profile-service/dist:/base/apps/profile-service/dist
      - ./apps/profile-service/src:/base/apps/profile-service/src
      - /base/profile-service/node_modules
    command: yarn dev
    environment:
      FASTIFY_PORT: 3000
      NEO4J_URL: bolt://neo4j:7687
      NEO4J_USER: neo4j
      NEO4J_PASSWORD: test

  neo4j:
    image: neo4j:latest
    container_name: neo4j
    networks:
      - basenet
    ports:
      - 7474:7474
      - 7687:7687
    expose:
      - 7474:7474
      - 7687:7687
    restart: on-failure
    volumes:
      - ./docker-data/neo4j/plugins:/plugins
    environment:
      NEO4J_AUTH: neo4j/test
      NEO4J_dbms_logs_debug_level: DEBUG

networks:
  basenet:
    name: "sessions-network"

The Node app just can't connect to Neo4j through bolt or the normal neo4j connection prefix.

@JonasHiltl,

I've tried your docker-compose configuration and I could not ping neo4j because it could not resolve the name neo4j. It seems to be an issue in the network/docker setup. Could you try to ping the neo4j container from your application container?

I am able to ping the neo4j container with docker compose exec profile ping neo4j

Are you able to telnet this neo4j using port 7687 from inside the app container? Try to wget/curl http://neo4j:7474 also could help.

The error seems to be in the socket level,

@JonasHiltl,does this problem still happening?

@bigmontz I'm currently not working with the client anymore. So you could close this.