1

I've the following problem: I created a simple NodeJS app, where there is a listening server on port number 3000. I definded some simple operations, like post, put and read. Anyway, this operation are performed into a database executed as Docker Container, on port number 5432 (postgres). In local, the application works perfectly. Instead, if I try to Dockerize my app and execute it:

FROM node:16
WORKDIR /app
COPY package*.json /app
RUN npm install
COPY . /app
CMD ["npm", "start"]

I receive the following error:

      original: Error: connect ECONNREFUSED 127.0.0.1:5432
          at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) {
        errno: -111,
        code: 'ECONNREFUSED',
        syscall: 'connect',
        address: '127.0.0.1',
        port: 5432
      }

}

As if it was not possible to connect to the postgres db. Why this happens? In local I perfectly can connect to postgres, but if I execute my app as a Docker Container, I can't connect to postgres. Thank you everybody!

  • 2
    In a docker container, `localhost` means the container itself. Your database isn't running in the node container, so localhost doesn't work. We need to know more about your setup to help you figure out what you should use instead. Is the database running in a container? Is it running on the host machine? If it's running on the host machine, what OS is that? – Hans Kilian Mar 30 '22 at 11:29
  • everything is running on my localhost machine (I use windows 10). I use docker desktop to start postgres container at port number 5432. Then I dockerize my application with: "docker build -t node-docker-tutorial ." and then I execute it with "docker run -it -p 9000:3000 node-docker-tutorial" – raffaeledp98 Mar 30 '22 at 11:32
  • I've linked to two questions related to this. The "communicate between containers" question describes how to create a Docker network, or you can use Docker Compose that does this setup for you. Then the "ECONNREFUSED" question describes the more specific problem you're having here. – David Maze Mar 30 '22 at 12:15

1 Answers1

2

A container has its own localhost so connecting to localhost would try to connect to a database running within the container and as you don't have a database server running within the container on localhost you can't connect to it.

You can connect to the database running on the host using host.docker.internal (for Mac/ Windows) as a hostname to refer to the host or start the container in the host network (only possible on Linux) and then it should work.

Have a look at this answer which goes into more details.

Mushroomator
  • 6,516
  • 1
  • 10
  • 27