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.