簡體   English   中英

Postgres ECONNREFUSED 在 Docker 上使用 NodeJS 編寫

[英]Postgres ECONNREFUSED on Docker Compose with NodeJS

當我嘗試從 docker 中的 NodeJS 應用程序通過 docker-compose 運行時連接到 docker 中的 postgres 服務器時收到 ECONNREFUSED。 但是我可以從我的主機連接。 這是我的 docker-compose.yml:

version: "2.4"

services:
  api:
    build: 
      context: .
      target: dev
    depends_on: 
      - postgres
    ports: 
      - "8080:8080"
      - "9229:9229"
    networks:
      - backend
    environment:
      - NODE_ENV=development
      - PGHOST=postgres
      - PGPASSWORD=12345678
      - PGUSER=test
      - PGDATABASE=test
      - PGPORT=5433
    volumes: 
      - .:/node/app
      - /node/app/node_modules # Use empty volume to hide the node_modules from the host os

  postgres:
    image: postgres:11
    restart: always
    ports:
    - "5433:5432"
    networks:
      - backend
    volumes:
      - db-data:/var/lib/postgresql/data
    environment: 
      POSTGRES_PASSWORD: 12345678
      POSTGRES_USER: test
      POSTGRES_DB: test

networks:
  backend:

volumes:
    db-data:

nodeJS代碼:

const client = new Client({
      user: process.env.PGUSER,
      host: process.env.PGHOST,
      database: process.env.PGDATABASE,
      password: process.env.PGPASSWORD,
      port: Number(process.env.PGPORT),
    });
client.connect();

錯誤:

{ Error: connect ECONNREFUSED 172.22.0.2:5433
api_1   |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)
api_1   |   errno: 'ECONNREFUSED',
api_1   |   code: 'ECONNREFUSED',
api_1   |   syscall: 'connect',
api_1   |   address: '172.22.0.2',
api_1   |   port: 5433 }

同時,我可以毫無問題地從主機操作系統連接到數據庫服務器。 網絡有問題嗎?

編輯:在 nodejs 應用程序嘗試之前,dB 服務器已准備好接受連接(我也嘗試從 nodejs 應用程序中重試連接)。

不,網絡沒有錯。 只是因為您連接到錯誤的端口。

在 compose 網絡中,您的postgres容器暴露了5432端口,因此它只接受來自 compose 網絡中該端口的請求。 所以只需要將PGPORT=5433更改為PGPORT=5432

您可以從主機操作系統訪問的原因是因為 docker-compose 映射了您的端口5433:5432 ,因此從外部(主機操作系統)對5433的所有請求都將傳遞到您的撰寫網絡內的5432

希望足夠清楚,以便您解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM