У меня есть база данных postgresql в контейнере Docker и API бэкенда в другом контейнере Docker (nodeJS). Оба эти контейнера запускаются с использованием docker-compose, поэтому используют мостовую сеть.
Если я использую стандартный запрос HTTP post в бэкэнд-API узла, я могу подключиться к БД, используя имя контейнера докера БД (как и ожидалось), как показано ниже (фрагмент кода показывает только настройки):
const UN = 'postgres';
const PW = '<PW>';
const host = 'myContainerName:5432';
const database = '<DB>';
const expireDuration = 120;
//DB Connection object (client)
var conString = "postgres://" + UN + ":" + PW + "@" + host + "/" + database;
...
Это работает, поскольку имя контейнера (на 3 строки ниже) интерпретируется каким-то образом ассоциацией NAT в Docker (я не очень хорошо понимаю внутреннюю работу Docker). Но я понимаю, что использование имени контейнера необходимо, поскольку IP-адреса могут меняться для контейнеров.
Однако теперь я хочу подключиться к базе данных postgresql, используя Knex в бэкэнд-API, поскольку я хочу начать использовать миграцию базы данных, и Knex - мой предпочтительный инструмент для этого.
Однако Knex позволяет мне подключаться только по IP-адресу контейнера докера, а не по имени его контейнера, например (это настройка Knex):
development: {
client: 'pg',
connection: {
host : 'myContainerName:5432',
//host : '172.20.0.3:5432',
user : 'postgres',
password : '<PW>',
database : '<DB>'
},
migrations: {
tableName: 'knex_migrations'
}
}
Если я переключу комментарий для имени хоста на имя контейнера, он не сможет подключиться.
Кто-нибудь знает, если я делаю что-то ужасно неправильно, ожидая, что это сработает? Есть ли способ использовать имя контейнера в Knex?