docker-compose up && docker-compose build: ошибка с PostgreSQL - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь реализовать свой файл docker-compose, но у меня есть ошибка с моей базой данных PostgreSQL.Если я начну свой проект с npm start, у меня не будет проблем.Для запуска моего проекта с помощью docker я использую: docker-compose up && docker-compose build

docker-compose.yml
version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    ports:
      - 8080:8080
    depends_on:
      - db
db:
  image: postgres:latest
  ports:
    - 5432:5432
  environment:
    DATABASE_URL: postgres://postgers@db:5432/API
# volumes:
#   - /var/lib/postgres/data
client:
   build: ./client_web/
   container_name: client_web
   ports:
     - 8081:8081

Мой вывод:

Starting client_web         ... done
Starting dev_area_2018_db_1 ... done
Starting dev-area-2018      ... done
Attaching to dev_area_2018_db_1, client_web, dev-area-2018
db_1      | 2019-02-28 17:51:40.679 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1      | 2019-02-28 17:51:40.679 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1      | 2019-02-28 17:51:40.698 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1      | 2019-02-28 17:51:40.741 UTC [23] LOG:  database system was shut down at 2019-02-28 17:46:23 UTC
db_1      | 2019-02-28 17:51:40.759 UTC [1] LOG:  database system is ready to accept connections

client_web |
client_web | > dev-area-2018-client@0.0.0 start /usr/src/app
client_web | > node ./app.js
client_web |
client_web | Your client is currently running on port 8081
dev-area-2018 |
dev-area-2018 | > dev-area-2018@0.0.0 start /usr/src/app
dev-area-2018 | > node ./bin/www
dev-area-2018 |
dev-area-2018 | Server running at http://localhost:8080/
dev-area-2018 | could not connect to postgres { Error: connect ECONNREFUSED 127.0.0.1:5432
dev-area-2018 |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1083:14)
dev-area-2018 |   errno: 'ECONNREFUSED',
dev-area-2018 |   code: 'ECONNREFUSED',
dev-area-2018 |   syscall: 'connect',
dev-area-2018 |   address: '127.0.0.1',
dev-area-2018 |   port: 5432 }

Я не понимаю, почему я не могу подключитьсямой сервер на моей базе данных PostgreSQL с Docker.

РЕДАКТИРОВАТЬ: Спасибо за вашу помощь, но с вашими решениями у меня всегда та же проблема и тот же вывод.Мне удалось с этим docker-compose:

version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    restart: always
    ports:
      - 8080:8080
    links:
      - db
      - db:database
    depends_on:
      - db
    environment:
      DATABASE_URL: postgres://postgres@db
  client:
    build: ./client_web/
    container_name: client_web
    ports:
       - 8081:8081
  db:
    image: postgres:latest
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_DB: API

Спасибо, С уважением.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

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

Поскольку в большинстве случаев контейнер server будет работатьи попробуйте подключиться к контейнеру db, однако для запуска db требуется время (обычно 10-15 секунд).

Вот почему вы получаете исключение could not connect to postgres { Error: connect ECONNREFUSED 127.0.0.1:5432, потому что dbне подключен и не готов принимать соединения.

Что вы можете сделать, это перезапустить ваш контейнер server после того, как он не запустится.

version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    restart: always # will restart the container if fails to start
    ports:
      - 8080:8080
    depends_on:
      - db
...
0 голосов
/ 01 марта 2019

Ваш клиент проекта пытается получить доступ к postgress в 127.0.0.1:5432, этот адрес больше не применяется в архитектуре докера.

Согласно документации докера :

По умолчанию Compose настраивает единую сеть для вашего приложения.Каждый контейнер для службы присоединяется к сети по умолчанию и доступен для других контейнеров в этой сети и может быть обнаружен ими с именем хоста, идентичным имени контейнера.

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

Итак, от вашего клиента вы должны получить доступ к postgress с помощью следующей строки:

 postgres://<user>:<password>@db/api.

Обратите внимание, что любой запрос к db будет перехвачен докером и перенаправлен на host:portКонтейнер в виртуальной сети, управляемый Docker.

0 голосов
/ 01 марта 2019

При использовании postgres с докером, я бы не рекомендовал указывать URL, как указано выше.URL-адрес, который вы указали выше, уже используется для доступа к нему через внутреннюю сеть докеров.Если вы удалите это, то URL, который вам понадобится для доступа к экземпляру postgres, будет postgres://USER:PWD@postgres/your_db.

Кроме того, у вас есть опечатка в вашем URL.

...