【问题标题】:Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:5432 with dockers未处理的拒绝 SequelizeConnectionRefusedError:将 ECONNREFUSED 127.0.0.1:5432 与 docker 连接
【发布时间】:2020-03-12 20:57:26
【问题描述】:

我正在尝试为我的 Postgres 构建一个 docker-compose 文件,该文件使用 sequelize 作为 ORM (https://sequelize.org/)。这是我的 docker-compose.yml

version: "2"

services:

 web:
  build: 
    context : .
    dockerfile: Dockerfile
  image : testorganization
  ports:
   - "5000:5000"
  links:
   - db

 db:
  image: postgres
  expose:
    - 5432
  volumes:
    - ./data/db:/data/db
  environment:
    POSTGRES_HOST: db
    POSTGRES_DB: postgres
    POSTGRES_USER: postgres
    POSTGRES_PASS: admin

Dockerfile

FROM node:8-alpine
LABEL description="Docker file for organizations app"
RUN mkdir -p /var/www/logs/
RUN mkdir -p /logs/
RUN mkdir -p /usr/src/
WORKDIR /usr/src/

ADD package.json /usr/src/package.json
RUN npm install --production

COPY . .

CMD ["node", "index.js"]

下面是我的连接字符串

this.sequelize =  new Sequelize( 'postgres','postgres','admin',{'host':'db', 'dialect': 'postgres',"define": { "createdAt": "createdat","updatedAt": "updatedat"}, 'operatorAliases': operatorsAliases} );

无论我做什么更改,它总是连接到 127.0.0.1:5432 并得到以下错误:

web_1  | Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:5432
web_1  |     at connection.connect.err (/usr/src/node_modules/sequelize/lib/dialects/postgres/connectionmanager.js:170:24)
web_1  |     at Connection.connectingErrorHandler (/usr/src/node_modules/pg/lib/client.js:191:14)
web_1  |     at emitOne (events.js:116:13)
web_1  |     at Connection.emit (events.js:211:7)
web_1  |     at Socket.reportStreamError (/usr/src/node_modules/pg/lib/connection.js:72:10)
web_1  |     at emitOne (events.js:116:13)
web_1  |     at Socket.emit (events.js:211:7)
web_1  |     at emitErrorNT (internal/streams/destroy.js:66:8)
web_1  |     at _combinedTickCallback (internal/process/next_tick.js:139:11)
web_1  |     at process._tickCallback (internal/process/next_tick.js:181:9)
  1. 尝试将域 db 保留在连接字符串中,与 docker-compose 文件中使用的引用相同
  2. 保持所有连接都打开 postgres.conf 文件。

我错过了什么?已经坚持了一段时间了。 谢谢

【问题讨论】:

  • 这行image : testorganization需要删除。
  • 看起来 Docker 将 db DNS 名称解析为 localhost,因为您在 docker-compose 文件中使用旧的 links 语法。我建议不要再使用links,而是在你的 docker-compose 文件中定义一个网络。你可以阅读更多herehere

标签: node.js postgresql docker docker-compose sequelize.js


【解决方案1】:

index.js

const Sequelize = require('sequelize');
const sequelize = new Sequelize("postgres", "postgres", "admin", {
  host: "db",
  dialect: "postgres",
  pool: {
    max: 9,
    min: 0,
    idle: 10000
  }
});

sequelize.authenticate().then(() => {
  console.log("Success!");
}).catch((err) => {
  console.log(err);
});

Dockerfile - 与问题中的相同

package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "sequelize": "",
    "pg": ""
  }
}

docker-compose.yml(重写版)

重要提示:如果您同时定义镜像和 Dockerfile 并构建,则镜像优先且不会使用您的 dockerfile 构建。

version: "3.2"

services:
  web:
    build: 
      context : .
      dockerfile: Dockerfile
    networks:
      - examplenetwork
    ports:
      - "5000:5000"
    depends_on:
      - db

  db:
    image: postgres
    networks:
      - examplenetwork
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASS=admin 

networks:
  examplenetwork: 

volumes:
  postgresql:
  postgresql_data:

【讨论】:

  • 您能否分享您的 Dockerfile / 源的最小版本以重现该错误?
  • 请发布具体的错误信息。你能分享一个示例代码来重现错误吗?目前,它指出了代码中的一个问题。基础设施方面,容器之间的通信对我来说是通过上面的 docker-compose.yml
  • 已编辑错误消息。发布代码将太长,因此发布了连接字符串。如果我在主机中进行更改并直接运行应用程序,它会抛出一个正确的错误,说找不到地址。另外是否需要在代码中使用任何环境变量?
  • 这就是我要求示例代码的原因。例如只是数据库连接;)
  • 另外 package.json 将有助于了解您的依赖关系
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 2020-11-27
  • 2021-01-19
  • 2019-12-22
  • 2020-12-14
  • 2022-01-15
  • 2019-05-03
相关资源
最近更新 更多