web-dev-qa-db-ja.com

Dockerを使用したnodeJS上のPostgresのECONNREFUSED

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

コンテナーを使用せずにサーバーを実行しようとすると(実際のマシンで実際のnodejsとpostgresdを使用)、動作します。

しかし、私はそれがコンテナで正しく動作することを望みます。私が間違っていることを理解していません。

ここに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

誰かが私を助けてくれますか?

(dockerが好きな人:))

28
Stainz42

DATABASE_URL127.0.0.1を参照します。これは ループバックアダプター (詳細 ここ )です。これは「自分に接続する」ことを意味します。

両方のアプリケーションを(Dockerを使用せずに)同じホストで実行する場合、両方とも同じアダプター(localhostとも呼ばれます)でアドレス指定できます。

コンテナで両方のアプリケーションを実行する場合、以前のように両方ともローカルホストにありません。代わりに、webコンテナをdocker0アダプタのdbコンテナのIPアドレスにポイントする必要があります。これはdocker-composeが設定します。

変化する:

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

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

これはDockerリンクのおかげで機能します。webコンテナーには、dbコンテナーがオンになっているIPを指すdbエントリーを持つファイル(/etc/hosts)があります。これは、ホスト名を解決しようとするときにシステム(この場合はコンテナ)が最初に見る場所です。

48
Andy

さらに読者がいる場合は、Docker desktop for Macを使用している場合は、 doc で提案されているように、localhostまたはHost.docker.internalの代わりに127.0.0.1を使用してください。同じconnection refused...問題に遭遇しました。バックエンドapi-servicelocalhost/127.0.0.1を使用してpostgresに接続できませんでした。以下は、参照としての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
1
Abu Shumon

データベース変数を個別に送信する場合。データベースホストを割り当てることができます。

DB_Host=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.
0
MED