Как подключиться к postgres с сервера узлов, когда оба запускаются в среде докера - PullRequest
0 голосов
/ 10 ноября 2018

В настоящее время у меня возникают некоторые проблемы с докером и при подключении проекта узла к postgres при работе внутри него. Кстати, я использую панель инструментов Docker, поскольку у меня нет Windows Pro.

мой файл docker-compose выглядит так

version: '3'
 services:
  db:
    image: postgres:latest
    ports:
     - "5432:5432"
  environment:
    POSTGRES_PASSWORD: 123456
    POSTGRES_USER: postgres
    POSTGRES_DB: dockerdb
  network_mode: bridge
  container_name: postgres
  volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

 web:
  build: .
  ports:
   - "5000:5000"
   - "3000:3000"
  depends_on:
   - db
  environment:
   DB_HOST: db

и мой экспресс-сервер именно такой, сейчас немного беспорядочно.

const { Pool } = require('pg')
var express = require('express');
var app = express;

const pool = new Pool({
  user: 'postgres',
  host: process.env.DB_HOST || 'localhost',
  database: 'dockerdb',
  password: '123456',
  port: 5432
  
})

// the pool with emit an error on behalf of any idle clients
// it contains if a backend error or network partition happens
pool.on('error', (err, client) => {
  console.error('Unexpected error on idle client', err)
  process.exit(-1)
})

// callback - checkout a client
pool.connect((err, client, done) => {
  if (err) throw err
  client.query('SELECT * FROM users WHERE id = $1', [1], (err, res) => {
    done()

    if (err) {
      console.log(err.stack)
    } else {
      console.log(res.rows[0])
    }
  })
})

Когда я запускаю его в докере, контейнеры запускаются, я могу получить доступ к postgress db через терминал и взаимодействовать с ними, как при создании и вставке подобных вещей, но моя программа-нод, похоже, не связывается с ней, так как я не Я не знаю, из-за проблемы с соединением или просто из-за некоторых ошибок noobie, некоторые могут мне помочь. Кстати, я создал таблицу с именем users в моем файле init.sql и передал ей данные, данные, к которым я смог получить доступ из докерского терминала с помощью команды psql.

вот изображение того, что происходит внутри докера. введите описание изображения здесь

Ответы [ 2 ]

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

Чтобы очистить ваш Express API, я бы выполнил рефакторинг следующим образом:

// Express App Setup
const express = require(‘.express’);
const bodyParser = require(‘body-parser’);
const cors = require(‘cors’);

const app = express();
app.use(cors());
app.use(bodyParser.json());

// Postgres Client Setup
const { Pool } = require(‘pg’);
const pgClient = new Pool({
   user: keys.pgUser,
   host: keys.pgHost,
   database: keys.pgDatabase,
   password: keys.pgPassword,
   port: keys.pgPort
});
pgClient.on(‘error’, () => console.log(‘Lost PG Connection’));

pgClient.query(‘CREATE TABLE IF NOT EXISTS values (number INT)’)

И это при условии, что вам еще не удалось создать успешное соединение, что означает, что вы еще не создали таблицу, что вам нужно сделать для подключения.

Таким образом, имя таблицы будет представлять собой значения и будет содержать один столбец информации, который будет называться числом, и это индекс отправленного значения из приложения веб-интерфейса, которое я подключил к своему Express API, так что вам придется настроить этот запрос таблицы к спецификациям вашего проекта, но вы будете использовать CREATE TABLE IF NOT EXISTS.

Затем я добавляю оператор catch, чтобы, если что-то пошло не так при создании этой таблицы, вы утешили сообщение об ошибке, например:

// Express App Setup
const express = require(‘.express’);
const bodyParser = require(‘body-parser’);
const cors = require(‘cors’);

const app = express();
app.use(cors());
app.use(bodyParser.json());

// Postgres Client Setup
const { Pool } = require(‘pg’);
const pgClient = new Pool({
   user: keys.pgUser,
   host: keys.pgHost,
   database: keys.pgDatabase,
   password: keys.pgPassword,
   port: keys.pgPort
});
pgClient.on(‘error’, () => console.log(‘Lost PG Connection’));

pgClient.query(‘CREATE TABLE IF NOT EXISTS values (number INT)’).catch(err => console.log(err));

Для вашего docker-compose.yml Я бы просто реорганизовал это так:

version: "3"
services:
  postgres:
    image: "postgres:latest"

и запустите docker-compose up и посмотрите, как это будет.

0 голосов
/ 10 ноября 2018

Это происходит потому, что для запуска БД требуется некоторое время, и ваш докер создает ваш сервер, и БД запускаются одновременно. Поэтому вам нужно немного задержаться на сервере, чтобы запустить БД. У меня есть пример в github, который вы можете загрузить и протестировать https://github.com/PedroS11/node-postgres-redis-docker. Проверьте мой файл docker-compose, где вы можете увидеть, что у меня есть скрипт wait-for-it. Этот сценарий находится в спящем режиме, поэтому сервер запускается только через 15 секунд после базы данных.

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