ECONNREFUSED для Postgres на nodeJS с докеры

Я создаю приложение, работающее на NodeJS, используя postgresql. Я использую SequelizeJS как ORM. Чтобы избежать использования реального демона postgres и иметь nodejs на моем собственном устройстве, я использую контейнеры с компоновкой докеров.

когда я запускаю 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

Может ли кто-нибудь помочь мне, пожалуйста?

(кто-то, кто любит докер :))

Ответ 1

Ваш DATABASE_URL относится к 127.0.0.1, который является адаптером loopback (подробнее здесь). Это означает "подключиться к самому себе".

При запуске обоих приложений (без использования Docker) на том же хосте они оба адресуются на одном адаптере (также известном как localhost).

При запуске обоих приложений в контейнерах они не оба на локальном хосте, как раньше. Вместо этого вам нужно указать web - контейнер с db IP - адрес контейнера на docker0 адаптер - который docker-compose наборы для вас.

Изменить:

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

в

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

Это работает благодаря ссылкам Docker: в web контейнере есть файл (/etc/hosts) с записью db указывающей на IP-адрес, в котором находится контейнер db. Это первое место, когда система (в данном случае, контейнер) будет выглядеть при попытке разрешить имена хостов.

Ответ 2

Если вы отправляете базу данных vars отдельно. Вы можете назначить хост базы данных.

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