Node.js Can’;t从应用程序容器连接到postgresDB docker容器

Node.js Can’;t从应用程序容器连接到postgresDB docker容器,node.js,postgresql,docker,docker-compose,postgis,Node.js,Postgresql,Docker,Docker Compose,Postgis,我目前在docker和连接节点项目与Postgres时遇到了一些问题 我已经问了一个相关的问题,但是,我不能把注意力集中在nodeJs和postgres之间的连接问题上 我的docker compose文件如下所示: # docker-compose.yml version: "2.1" services: app: build: . ports: - "49160:8080" networks: - webnet depends_o

我目前在docker和连接节点项目与Postgres时遇到了一些问题

我已经问了一个相关的问题,但是,我不能把注意力集中在nodeJs和postgres之间的连接问题上

我的docker compose文件如下所示:

# docker-compose.yml
version: "2.1"

services:
  app:
    build: .
    ports:
      - "49160:8080"
    networks:
      - webnet
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:taskin@db:5432/mydb


  db:
    image: kartoza/postgis:9.6-2.4
    networks: 
      - webnet
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_MULTIPLE_EXTENSIONS=postgis,pgrouting
      - ALLOW_IP_RANGE=0.0.0.0/0
    volumes:
      - pgdata:/var/lib/postgresql/data

    restart: on-failure
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  webnet:

volumes:
  pgdata: {}

我的Dockerfile具有以下输入:

#node 8
FROM node:8

#Create app directory
WORKDIR /usr/src/app

#Install app dependencies
COPY package*.json ./

RUN npm install

#Bundle app source
COPY . . 

EXPOSE 8080

CMD ["npm", "start"]

my nodeJS express服务器具有以下设置:

var pg = require('pg');
var conString = process.env.DATABASE_URL || "postgres://postgres:mypassword@db:5432/mydb";

var client = new pg.Client(conString);

client.connect()
当我运行docker compose时

  • 我首先得到一个密码身份验证错误:我可以通过编辑
    pg_hba.conf
    postgresql.conf
    来解决这个问题,如本链接中所述

  • 重新启动PostgreSQL并更改postgres用户的密码后,我将SQL备份文件恢复到容器中的mydb中

  • 然后我停止了前面的docker compose命令,再次执行了
    sudo docker compose up
    。获得以下输出


  • 在尝试了很多之后,我可以修复它。我的docker compose文件是正确的,我的
    ajax请求
    没有正确定义。更换后

     $.ajax({
        url: 'http://db:8080/show',
        type: "POST",
        data: CoordjsonObject,
        dataType: "json",
        success: function(data) {
          addStreetsLayer(data);
          console.log("worked!")
          },   
        error: function(xhr) {
          console.log(xhr)
          }
      });
    


    在尝试了很多之后,我可以修复它。我的docker compose文件是正确的,我的
    ajax请求
    没有正确定义。更换后

     $.ajax({
        url: 'http://db:8080/show',
        type: "POST",
        data: CoordjsonObject,
        dataType: "json",
        success: function(data) {
          addStreetsLayer(data);
          console.log("worked!")
          },   
        error: function(xhr) {
          console.log(xhr)
          }
      });
    


    app_1_ca885d4626de | wait-for-it.sh:等待15秒等待db:5432
    :可能再等一点,因为第一个错误发生在
    db_1_ceb54072343c | 2019-07-04 12:23:14.921 UTC[18]之前约1秒日志:数据库系统已准备好接受连接
    ?现在我收到另一个错误消息:
    错误:connect econnreference172.20.0.2:5432
    此外,根据您的情况,您可以使用
    healthcheck
    (从未使用过它),主要取决于。运行时,最好将此
    等待它。sh
    逻辑移到编写器。您等待了多长时间?我想说,要验证错误是否真的来自数据库未准备就绪,您应该等待120秒(当节点启动时,您的日志不应该再显示任何与
    DB
    -相关的内容,这样您就可以确定问题是否源于两个容器之间缺乏同步)。我删除了wait-for-it.sh命令,并在我的docker compose文件中将其替换为dependens_on:db,但仍然得到
    Error:getaddrinfo ENOTFOUND db:5432
    app_1; ca885d4626de | wait-for-it.sh:等待db:5432 15秒:可能再等一点,因为第一个错误发生在
    db_1; ceb54072343c | 2019-07-04 12:23:14.921 UTC之前大约1秒[18] 日志:数据库系统已准备好接受连接
    ?现在我收到另一个错误消息:
    错误:connect econnrefuse172.20.0.2:5432
    另外,根据您可以使用
    健康检查
    (从未使用过)主要取决于。当你运行它时,最好将这个
    等待它。sh
    逻辑转移到编写器。你等了多长时间?我想说,要验证错误是否真的来自数据库没有准备好,你应该等120秒(当节点启动时,您的日志不应该再显示任何与
    db
    相关的内容,这样您就可以确定问题是否来自两个容器之间缺乏同步)。我删除了wait-for-it.sh命令,并将其替换为docker compose文件中的dependens_on:db,但仍然得到
    错误:getaddrinfo ENOTFOUND db:5432
     $.ajax({
        url: 'http://IP-ADRESS-OF-NODE-CONTAINER:8080/show',
        type: "POST",
        data: CoordjsonObject,
        dataType: "json",
        success: function(data) {
          addStreetsLayer(data);
          console.log("worked!")
          },   
        error: function(xhr) {
          console.log(xhr)
          }
      });