NodeJS 14 в контейнере Docker не может подключиться к Postgres DB (вход / выход docker) - PullRequest
1 голос
/ 03 мая 2020

Я создаю приложение React-Native, используя Rest API (NodeJS, Express) и PostgreSQL.

Все работает хорошо, когда размещено на моей локальной машине. Все работает хорошо, когда API находится на моей машине и PostgreSQL в docker контейнере.

Но когда backend и frontend находятся в docker, база данных доступна со всего моего компьютера локально, но не по бэкэнду.

Я использую docker -compose.

version: '3'
services:
  wallnerbackend:
    build:
      context: ./backend/
      dockerfile: ../Dockerfiles/server.dockerfile
    ports:
    - "8080:8080"
  wallnerdatabase:
    build:
      context: .
      dockerfile: ./Dockerfiles/postgresql.dockerfile
    ports:
    - "5432:5432"
    volumes:
    - db-data:/var/lib/postgresql/data
    env_file: .env_docker
volumes:
  db-data:

.env_ docker и .env имеют одинаковые параметры (только изменение имени).

Вот мои докер-файлы:

Backend

FROM node:14.1

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]

База данных

FROM postgres:alpine

COPY ./wallnerdb.sql /docker-entrypoint-initdb.d/

Я попытался изменить имя хоста в URL-адресе соединения на postgres, используя имя docker, мой IP-адрес хоста, localhost, но безрезультатно.

Это также тот же .env (файл в моем репозитории узла с именем db_ passwd et c), который я использую в локальной сети для подключения моего бэкенда к базе данных.

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Вы должны получить доступ к вашей БД, используя имя сервиса в качестве имени хоста. Вот мой рабочий пример - https://gitlab.com/gintsgints/vue-fullstack/-/blob/master/docker-compose.yml

0 голосов
/ 04 мая 2020

Я ожидаю, что проблема связана с URL-адресом соединения с базой данных, поскольку вы не предоставили к нему общий доступ.

Контейнеры в одной сети в docker-compose.yml могут связываться друг с другом, используя имя службы. В вашем случае имя службы базы данных wallnerdatabase, поэтому это имя хоста, которое вы должны использовать в URL-адресе соединения с базой данных.

URL-адрес соединения с базой данных, который вы должны использовать в своей серверной службе, должен быть похож на this:

postgres://user:password@wallnerdatabase:5432/dbname

Также убедитесь, что внутренний код вызывает базу данных, используя имя хоста wallnerdatabase, как это определено в файле docker-compose.yml.

Вот ссылка на Сеть в Docker Составить .

0 голосов
/ 03 мая 2020

Поскольку вы используете NodeJS 14 в контейнере Docker - убедитесь, что установлена ​​последняя зависимость pg:

https://github.com/brianc/node-postgres/issues/2180

В качестве альтернативы: перейдите к узлу 12.

Также убедитесь, что база данных и «бэкэнд» находятся в одной сети. Также: бэкэнд лучше всего «зависеть» от базы данных.

version: '3'

services:
  wallnerbackend:
    build:
      context: ./backend/
      dockerfile: ../Dockerfiles/server.dockerfile
    ports:
      - '8080:8080'
    networks:
      - default
    depends_on:
      - wallnerdatabase
  wallnerdatabase:
    build:
      context: .
      dockerfile: ./Dockerfiles/postgresql.dockerfile
    ports:
      - '5432:5432'
    volumes:
      - db-data:/var/lib/postgresql/data
    env_file: .env_docker
    networks:
      - default

volumes:
  db-data:

networks:
  default:

Это не должно быть необходимым в вашем случае - как указано в комментариях - поскольку Docker Compose уже создает сеть по умолчанию

Имя контейнера "wallnerdatabase" - это имя хоста вашей базы данных - если не настроено иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...