1

我有一个名为 microsoft/mssql-server-linux 的 SQL Server Docker 映像,用于启动 SQL Server 数据库。我有一个在 Docker 之外创建的 API,但我尝试构建一个连接字符串以连接到该数据库,但没有成功。

我已使用 Azure Data Studio 成功连接到此数据库,只需使用以下连接设置

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

我使用 Feathersjs 创建了一个 API 项目,并使用 sequelize 作为 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 成功连接并在 docker 中更改了几次,以确保这不是凭据问题。

尝试连接时收到以下错误消息

错误:未处理的拒绝:Promise {"_bitField":18087936,"_fulfillmentHandler0":{"name":"SequelizeConnectionError","parent":{"message":"Failed to connect to 172.17.0.2:1433 in 15000ms", "code":"ETIMEOUT"},"original":{"message":"15000ms 内无法连接到 172.17.0.2:1433","code":"ETIMEOUT"}},"name":"SequelizeConnectionError", "parent":{"message":"15000ms 内连接 172.17.0.2:1433 失败","code":"ETIMEOUT"},"original":{"message":"连接 172.17.0.2 失败: 1433 in 15000ms","code":"ETIMEOUT"}} 错误:GeneralError:无法在 15000ms 内连接到 172.17.0.2:1433

4

2 回答 2

1

您的 docker 数据库容器准备好接受连接了吗?当您将 docker 与 sequelize 一起使用时,数据库和应用程序容器同时启动,因此您需要等待数据库容器准备好接受连接以将 sequelize 连接到您的数据库,此外,请确保正确链接两个容器。如果您使用 docker compose,请检查文档以链接容器,或者您可以使用网络。https://docs.docker.com/compose/networking/#links

于 2019-07-29T23:47:42.723 回答
0

聚会迟到了,但我用你的问题来解决我的错误,现在它可以工作了,所以我想我会分享

我在 Docker 上本地运行 MSSQL DB:

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

为了通过 sequelize 连接到它,我创建了一个“环境”,如下所示:

"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')
};

然后在运行时,我按如下方式配置了 sequelize(请注意,我使用我的 Nodejs 服务器中设置的配置来仅从 sequelize 环境文件中提取变量,但我在这里替换了它们):

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

请记住,我是 MSSQL 的新手,这可能不是最好的方法,但我很高兴我终于让它工作了

干杯!

于 2020-05-28T14:15:26.123 回答