Использование Docker Compose для соединения отдельных контейнеров Postgres и Node вместе - PullRequest
0 голосов
/ 19 июня 2020

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

Вот составной файл YAML:

version: "3"
services:
  api_dev:
    build: ./api
    command: sh -c "sleep 5; npm run dev" # I added the sleep in to wait for the DB to load but it doesn't work either way with or without this sleep part
    container_name: pc-api-dev
    depends_on:
      - dba
    links:
      - dba
    ports:
      - 8001:3001
    volumes:
      - ./api:/home/app/api
      - /home/app/api/node_modules
    working_dir: /home/app/api
    restart: on-failure
  dba:
    container_name: dba
    image: postgres
    expose: 
      - 5432
    ports:
      - '5431:5432'
    env_file:
      - ./api/db.env

В моем контейнере Node я жду, пока сервер Node раскрутится, и пытаюсь подключиться к базе данных в другом контейнере следующим образом:

const { Client } = require('pg')

const server = app.listen(app.get('port'), async () => {
    console.log('App running...');

    const client = new Client({
        user: 'db-user',
        host: 'dba', // host is set to the service name of the DB in the compose file
        database: 'db-name',
        password: 'db-pass',
        port: 5431,
    })

    try {
        await client.connect()
        console.log(client) // x - can't see this
        client.query('SELECT NOW()', (err, res) => {
            console.log(err, res) // x - can't see this
            client.end()
        })
        console.log('test') // x - can't see this
    } catch (e) {
        console.log(e) // x - also can't see this
    }

});

После того, как я подробно прочитал его сегодня, я увидел, что хост БД в приведенном выше коде подключения не может быть localhost, поскольку это относится к контейнеру, который в настоящее время работает, поэтому он должен быть установлен на служебное имя контейнера, к которому мы подключаемся (в данном случае dba). Я также сопоставил порты и вижу, что БД готова принимать соединения задолго до запуска моего Node-сервера.

Однако я не только не могу подключиться к базе данных из Node, но и не могу видеть журналы консоли успеха или ошибок из улова попытки. Это как если бы соединение не разрешается и никогда не истекает таймаут, но я не уверен.

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

Любое направление приветствуется, спасибо.

1 Ответ

0 голосов
/ 19 июня 2020

Вы устанавливаете имя контейнера и можете ссылаться на него по нему. Например,

db:
container_name: container_db

И хост: порт

DB_URL: container_db:5432
...