使用dockers在nodeJS上为Postgres进行ECONNREFUSED

问题描述 投票:23回答:3

我正在构建一个使用postgresql在NodeJS上运行的应用程序。我正在使用SequelizeJS作为ORM。为了避免使用真正的postgres守护进程并在我自己的设备上安装nodejs,我正在使用带有docker-compose的容器。

当我运行docker-compose up时,它启动了pg数据库

database system is ready to accept connections

和nodejs服务器。但是服务器无法连接到数据库。

Error: connect ECONNREFUSED 127.0.01:5432

如果我尝试在不使用容器的情况下运行服务器(在我的机器上使用真实节点js和postgres),它可以工作。

但我希望它与容​​器一起正常工作。我不明白我做错了什么。

这是docker-compose.yml文件

web:
  image: node
  command: npm start
  ports:
    - "8000:4242"
  links:
    - db
  working_dir: /src
  environment:
    SEQ_DB: mydatabase
    SEQ_USER: username
    SEQ_PW: pgpassword
    PORT: 4242
    DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
  volumes:
    - ./:/src
db:
  image: postgres
  ports:
  - "5432:5432"
  environment:
    POSTGRES_USER: username
    POSTGRES_PASSWORD: pgpassword

有人可以帮帮我吗?

(喜欢泊船的人:))

node.js postgresql docker sequelize.js
3个回答
45
投票

你的DATABASE_URL指的是127.0.0.1,这是loopback adapter(更多here)。这意味着“连接到我自己”。

在同一主机上运行两个应用程序(不使用Docker)时,它们都可以在同一个适配器(也称为localhost)上寻址。

在容器中运行这两个应用程序时,它们不像以前一样在localhost上。相反,你需要将web容器指向db适配器上的docker0容器的IP地址 - docker-compose为您设置。

更改:

DATABASE_URL: postgres://username:[email protected]:5432/mydatabase

DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase

这要归功于Docker链接:web容器有一个文件(/etc/hosts),其中db条目指向db容器所在的IP。这是尝试解析主机名时系统(在本例中为容器)的第一个位置。


1
投票

对于进一步的读者,如果你正在使用Docker desktop for Mac使用host.docker.internal而不是localhost127.0.0.1,因为它在doc中的建议。我遇到了同样的connection refused...问题。后端api-service无法使用postgres连接到localhost/127.0.0.1。下面是我的docker-compose.yml和环境变量作为参考:

version: "2"

services:
  api:
    container_name: "be"
    image: <image_name>:latest
    ports:
      - "8000:8000"
    environment:
      DB_HOST: host.docker.internal
      DB_USER: <your_user>
      DB_PASS: <your_pass>
    networks: 
      - mynw

  db:
    container_name: "psql"
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: <your_postgres_db_name>
      POSTGRES_USER: <your_postgres_user>
      POSTGRES_PASS: <your_postgres_pass>
    volumes:
      - ~/dbdata:/var/lib/postgresql/data
    networks:
      - mynw

0
投票

如果单独发送数据库变量。您可以分配数据库主机。

DB_HOST=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.
© www.soinside.com 2019 - 2024. All rights reserved.