【问题标题】:Nodejs cannot connect to Postgresdb containerNodejs 无法连接到 Postgresdb 容器
【发布时间】:2020-12-05 00:04:00
【问题描述】:

我目前正在使用 Rest API(Express、Nodejs)和 Postgresql 开发 Angular 应用程序。托管在我的本地计算机上时一切正常。测试后,我将图像移至 Ubuntu 服务器,以便可以将应用程序托管在外部端口上。我可以使用 https://serveripaddress:80 访问角度前端,但是在尝试登录时,api 没有连接到 Postgresql。我收到一条错误消息:ERR_CONNECTION_REFUSED。这是我的 docker-compose 文件:

version: '3.0' 

services:

  db:
    image: postgres:9.6-alpine
    environment:
      POSTGRES_DB: myDatabase
      POSTGRES_PASSWORD: myPwd
      POSTGRES_PORT: 5432
      POSTGRES_HOST: db

    ports:
    - 5434:5432
    restart: always
    volumes:
    - ./postgres-data:/var/lib/postgresql/data

  backend: # name of the second service
   image: myid/nodeapi
   ports:
   - 3000:3000

   environment:
    POSTGRES_DB: myDatabase
    POSTGRES_PASSWORD: myPwd
    POSTGRES_PORT: 5432
    POSTGRES_HOST: db
   depends_on:
   - db
   command: bash -c "sleep 20 && node server.js"

  myapp-portal:
    image: myId/angular-app
    ports:
    - "80:80"
    depends_on:
    - backend

volumes:
      postgres-data:

连接数据库的代码:

const { Client } = require('pg')


const client = new Client({
  database: process.env.POSTGRES_DB,
  user: 'postgres',
  password: process.env.POSTGRES_PASSWORD,
  host: process.env.POSTGRES_HOST,
  port: process.env.POSTGRES_PORT

})

client.connect()
.then(
  () => {
      console.log("db connected");
  })

以及后端的 docker-compose 日志:

后端_1 |数据库连接

当我执行到数据库 docker 容器并连接到 psql 时,我看到我的数据库已创建(手动使用 pg_dump),其中包含所有表和数据。我的猜测是 node.js 正在连接到安装时创建的默认 Postgres 数据库。我在本地机器上遇到了同样的问题,但我通过在 pgAdmin4 中创建一个新的服务器组并在端口 5434 上创建一个新的数据库来解决它。我不想在服务器上这样做,因为它违背了 docker 概念的目的。另一个想法可能是 node.js 甚至在它启动之前就尝试连接到数据库。这就是我添加在我的本地机器上工作的行'sleep 20'的原因。关于如何解决这个问题的任何想法?蒂亚!

【问题讨论】:

  • 我想你已经尝试过 docker-compose build 以防 docker-compose.yml 中的值发生变化
  • @Nikolay - 是的,我做到了。

标签: node.js postgresql docker-compose


【解决方案1】:

如果你想等待主机和 TCP 端口的可用性,你可以使用这个脚本https://github.com/vishnubob/wait-for-it 在您的 docker 文件中,您可以将此文件复制到容器中并更改模式

RUN chmod +x wait-for-it.sh

然后在您的 docker compose 中在您想要等待的服务上运行此脚本

entrypoint: bash -c "./wait-for-it.sh --timeout=0 service_name:service_port && node server.js"

【讨论】:

  • 在发布问题之前我已经尝试过了,现在又试了一次。仍然没有运气。当我连接到服务器并从我的机器运行应用程序时,它工作正常,但是当我从另一台计算机或手机尝试它时,它给了我错误消息 - ERR_CONNECTION_REFUSED。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2017-08-10
  • 2017-10-11
  • 2020-11-16
  • 2021-11-24
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多