#node.js #postgresql #docker #docker-compose #sequelize.js
#node.js #postgresql #docker #docker-создать #sequelize.js
Вопрос:
Я использую Sequelize ORM с диалектом PostgreSQL, размещенным в контейнере docker, работающем на localhost. Приложение запускается через порт 3050, а база данных через порт 5432 перенаправляется на 4321.
Ошибка:
Server is running on port: 3050
Unable to connect to the database: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:4321
docker-compose.yml
version: "3"
services:
app:
build: .
command: yarn start
ports:
- "3050:3050"
depends_on:
- postgres
volumes:
- .:/home/app/medtech
- /home/app/medtech/node_modules
postgres:
image: postgres:alpine
ports:
- "4321:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_DB: medtech_dev
POSTGRES_PASSWORD: uaz0ZWrsCeUG3271GsRB
Мой фрагмент подключения к БД
import Sequelize from 'sequelize';
import Constants from '../utils/constants';
const sequelize = new Sequelize(
Constants.database.name,
Constants.database.user,
Constants.database.password, {
host: Constants.database.host,
port: Constants.database.port,
dialect: 'postgres',
pool: {
max: 10,
min: 0,
acquire: 10000,
idle: 20000,
},
timezone: Constants.timezone,
},
);
Значения констант взяты из my .env:
DATABASE_PORT=4321
DATABASE_HOST=localhost
DATABASE_NAME=medtech_dev
DATABASE_USER=postgres
DATABASE_PASSWORD=uaz0ZWrsCeUG3271GsRB
По какой-то причине, которую я не знаю, я использую отдельный файл для запуска своих исходных данных и миграций, используя точно такие же константы базы данных, и это работает. Вот:
const Constants = require('../utils/constants').default;
module.exports = {
username: Constants.database.user,
port: Constants.database.port,
password: Constants.database.password,
database: Constants.database.name,
host: Constants.database.host,
dialect: 'postgres',
};
После многих изменений, которые я внес в свои файлы, и многих прочитанных мной потоков я не могу понять, что вызывает эту проблему. Я впервые использую Docker, и я не знаю, действительно ли что-то не так с моими конфигурационными файлами Docker или какая-то другая ошибка.
Я ценю любую помощь.
Комментарии:
1. Пожалуйста, добавьте значения констант
Ответ №1:
контейнер вашего приложения и postgres работают в двух разных контейнерах, это означает, что это две разные машины, каждая машина имеет свой собственный IP.
вы не можете вызвать службу postgres из вашего контейнера приложений с помощью localhost:postgresport
и наоборот, из postgres в контейнер приложений
кажется, что Constants.database.host
это localhost или 172.0.0.1, чтобы получить доступ к контейнеру postgres, вам нужно вызвать IP контейнера или имя или имя службы
в вашем случае измените Constants.database.host
значение на postgres
и попробуйте
Комментарии:
1. Значения констант были получены из файла .env, значения которого совпадают с теми, которые мы имеем в docker-compose.yml. Я сменил хост на ‘postgres’ и получил ту же ошибку с другим IP: 172.19.0.2:4321
2.
4321
является ли открытый порт сторонним докером, если вы собираетесь вызвать его из другого контейнера в той же сети, вам необходимо сменить порт на локальный порт5432
, поэтому измените номер порта на5432
3. Это отлично сработало. Большое вам спасибо! И теперь я понял причину, по которой мои миграции и исходные данные работают с localhost:4321 это просто потому, что я тогда работал вне docker.