трудности с подключением к базе данных SQL Server внутри док-контейнера с использованием Sequelize

У меня есть образ SQL Server Docker с именем microsoft/mssql-server-linux, который использовался для запуска базы данных SQL Server. У меня есть API, который я сделал вне Docker, и я безуспешно пытался создать строку подключения для подключения к этой базе данных.

Я успешно подключился к этой базе данных с помощью Azure Data Studio только со следующими параметрами подключения.

Connection Type: Microsoft SQL Server
Server: localhost
Username: (username I created)
Password: (password I created)

Я создал проект API, используя Feathersjs, и использую сиквел в качестве ORM. Вот как я пытался создать соединение.

  const sequelize = new Sequelize(database, username, password, {
    dialect: "mssql",
    host: localhost,
    encrypt: false,
    logging: false,
    operatorsAliases: false,
    define: {
      freezeTableName: true
    },
    dialectOptions: {
      port: 1433
      // instanceName: "NameOfTheMSSQLInstance"
    }
  });

Я использую порт 1433, потому что, когда я запускал «docker ps» в терминале, эта информация была указана в порту.

 0.0.0.0:1433->1433/tcp

Я знаю, что имя пользователя и пароль верны, потому что я успешно подключаюсь через Azure Data Studio и несколько раз менял их в докере, чтобы убедиться, что это не проблема с учетными данными.

Я получаю следующее сообщение об ошибке при попытке подключения

ошибка: необработанный отказ в: Promise {"_bitField":18087936,"_fulfillmentHandler0":{"name":"SequelizeConnectionError","parent":{"message":"Не удалось подключиться к 172.17.0.2:1433 за 15000 мс", "code":"ETIMEOUT"},"original":{"message":"Не удалось подключиться к 172.17.0.2:1433 за 15000 мс","code":"ETIMEOUT"}},"name":"SequelizeConnectionError", "parent":{"message":"Не удалось подключиться к 172.17.0.2:1433 за 15000 мс","code":"ETIMEOUT"},"original":{"message":"Не удалось подключиться к 172.17.0.2: 1433 в 15000 мс", "код": "ETIMEOUT"}} ошибка: GeneralError: не удалось подключиться к 172.17.0.2:1433 в 15000 мс


person Jeff Hernandez    schedule 29.07.2019    source источник
comment
При возникновении трудностей было бы полезно опубликовать полученное сообщение об ошибке, чтобы другие могли понять, в чем проблема.   -  person Sean Lange    schedule 29.07.2019
comment
Честная оценка. Спасибо   -  person Jeff Hernandez    schedule 29.07.2019
comment
Проблема в том, что время соединения истекло. здесь отличное место для начала. Кажется, многие другие решили это.   -  person Sean Lange    schedule 29.07.2019
comment
Используйте IP-адрес сервера, на котором вы запускаете контейнер SQL, с портом 1433 вместо локального хоста.   -  person nPcomp    schedule 30.07.2019


Ответы (2)


готов ли ваш контейнер базы данных докеров принимать соединения? когда вы используете докер с сиквелом, одновременно загружаются и база данных, и контейнер приложения, поэтому вам нужно подождать, пока контейнер базы данных будет готов принимать соединения для подключения сиквела к вашей базе данных, кроме того, убедитесь, что вы правильно связываете оба контейнера. если вы используете docker compose, проверьте документы, чтобы связать контейнеры, или вы можете использовать сети. https://docs.docker.com/compose/networking/#links

person A. Granados    schedule 29.07.2019

Поздно на вечеринку, но я использовал ваш вопрос, чтобы исправить свои ошибки, и теперь он работает, поэтому я решил поделиться

Я запустил базу данных MSSQL локально в Docker с помощью:

docker run --name sql_server_demo -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=1Secure*Password1' -e 'MSSQL_PID=Developer' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest

Чтобы подключиться к нему через сиквел, я создал «окружение» следующим образом:

"mssql": {
   "username": "sa",
   "password": "1Secure*Password1",
   "database": "master",
   "host": "127.0.0.1",
   "dialect": "mssql"
}

Это позволило мне запустить миграцию, так как мой файл .sequelizerc использовал ту же среду:

// .sequelizerc

const path = require('path');

module.exports = {
    'env': 'mssql',
    'config': path.resolve('src/config/env', 'sequelize_db.json'),
    'models-path': path.resolve('src', 'models'),
    'seeders-path': path.resolve('src', 'seeders'),
    'migrations-path': path.resolve('src', 'migrations')
};

затем во время выполнения я настроил сиквелизацию следующим образом (обратите внимание, что я использовал конфигурацию, настроенную на моем сервере Nodejs, чтобы просто извлекать переменные из файла среды сиквелизации, но я заменил их здесь):

this.sequelize = new Sequelize('master',  'sa', '1Secure*Password1', {
      host: '127.0.0.1',
      dialect: 'mssql',
      encrypt: false,
      define: {
            freezeTableName: true
      },
      dialectOptions: {
             port: 1433
      }
});

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

Ваше здоровье!

person Andrei S    schedule 28.05.2020