Sequelize не может синхронизироваться с MySQL в контейнере Docker из приложения Node / express (ECONNREFUSED) - PullRequest
0 голосов
/ 12 февраля 2019

Я впервые использую sequelize, MySQL и docker и не могу получить sequelize для подключения к БД.

Я проверил наличие БД с DBeaver и могу подключиться.Я также вижу, как контейнер MySQL отвечает в терминале при подключении через DBeaver.Однако при попытке установить соединение с кодом я получаю сообщение об ошибке ECONNREFUSED.

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

После того, как правильный ответ был предоставлен ниже, я заметил, что у меня была ошибка.Я пропустил следующее из контейнера «mysql» в файле docker-compose.yml.

networks:
    - app-tier

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

Файл docker-compose.yml:

version: '3'

networks:
    app-tier:
        driver: bridge
services:
    server:
        image: bitnami/node
        networks:
        - app-tier
        command: "sh -c 'npm install && npm run dev'"
        volumes:
        - ./server:/app
        ports:
        - 5000:5000
        depends_on:
        - mysql
    mysql:
        image: 'bitnami/mysql:latest'
        environment:
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
        - MYSQL_DATABASE=school
        networks:
            - app-tier
        ports:
        - '3306:3306'
        volumes:
        - ./db:/bitnami/mysql/data

Последовательное соединение:

const Sequelize = require('sequelize');

const sequelize = new Sequelize('school', 'root', 'password', {
dialect: 'mysql'
});

module.exports = sequelize;

Попытка синхронизации из app.js:

sequelize.sync()
    .then(result => console.log(result))
    .catch(err => console.log('EEEERRRROOOOOOR',err));

Терминальный вывод:

server_1    |  { SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
server_1    |     at Utils.Promise.tap.then.catch.err (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:139:19)
server_1    |     at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23)
server_1    |     at Promise._settlePromiseFromHandler (/app/node_modules/bluebird/js/release/promise.js:512:31)
server_1    |     at Promise._settlePromise (/app/node_modules/bluebird/js/release/promise.js:569:18)
server_1    |     at Promise._settlePromise0 (/app/node_modules/bluebird/js/release/promise.js:614:10)
server_1    |     at Promise._settlePromises (/app/node_modules/bluebird/js/release/promise.js:689:18)
server_1    |     at Async._drainQueue (/app/node_modules/bluebird/js/release/async.js:133:16)
server_1    |     at Async._drainQueues (/app/node_modules/bluebird/js/release/async.js:143:10)
server_1    |     at Immediate.Async.drainQueues (/app/node_modules/bluebird/js/release/async.js:17:14)
server_1    |     at runCallback (timers.js:810:20)
server_1    |     at tryOnImmediate (timers.js:768:5)
server_1    |     at processImmediate [as _immediateCallback] (timers.js:745:5)
server_1    |   name: 'SequelizeConnectionRefusedError',
server_1    |   parent:
server_1    |    { Error: connect ECONNREFUSED 127.0.0.1:3306
server_1    |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
server_1    |      errno: 'ECONNREFUSED',
server_1    |      code: 'ECONNREFUSED',
server_1    |      syscall: 'connect',
server_1    |      address: '127.0.0.1',
server_1    |      port: 3306,
server_1    |      fatal: true },
server_1    |   original:
server_1    |    { Error: connect ECONNREFUSED 127.0.0.1:3306
server_1    |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
server_1    |      errno: 'ECONNREFUSED',
server_1    |      code: 'ECONNREFUSED',
server_1    |      syscall: 'connect',
server_1    |      address: '127.0.0.1',
server_1    |      port: 3306,
server_1    |      fatal: true } }

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Работа в процессе Я борюсь с подобной проблемой, вот мои шаги для статической адресации:

networks:
  internal_UJJigBWx:
    driver: bridge
    ipam:
      config:
      - subnet: 172.16.238.0/24
      driver: default
services:
  express:
    build:
      context: .
    depends_on:
    - sql
    environment:
      DB_DATABASE: sequebase
      DB_DIALECT: mysql
      DB_HOST: 172.16.238.2
      DB_PASSWORD: sequeword
      DB_USERNAME: sequeuser
    networks:
      internal_UJJigBWx:
        ipv4_address: 172.16.238.3
    ports:
    - 80:3000/tcp
  sql:
    environment:
      MYSQL_DATABASE: sequebase
      MYSQL_PASSWORD: sequeword
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_USER: sequeuser
    image: bitnami/mysql:latest
    networks:
      internal_UJJigBWx:
        ipv4_address: 172.16.238.2
version: '3.0'

Основным отличием является статическая адресация с ipam .Вы можете использовать docker-compose config для проверки и просмотра расширений env.

Я использую задачи gulp на этапе сборки для вызова sequelize sync.Локально работает хорошо, но я не уверен, что это хороший подход к созданию докера

В процессе сборки образа используется args вместо environment.и эта фаза, по-видимому, происходит до раскрутки базы данных.Я не знаю, как ждать sql, чтобы синхронизировать продолжение ...

0 голосов
/ 12 февраля 2019

Чтобы подключиться к вашему серверу myslq из Docker-контейнера, вам нужно указать правильный адрес сервиса.Так что ваша инициализация должна выглядеть следующим образом.

const Sequelize = require('sequelize');

const sequelize = new Sequelize('school', 'root', 'password', {
host: 'mysql',
dialect: 'mysql'
});

module.exports = sequelize;
...