【问题标题】:Docker SQL Server 2017 on linux connection issueDocker SQL Server 2017 上的 Linux 连接问题
【发布时间】:2020-05-13 13:51:55
【问题描述】:

我的 Docker linux SQL Server 今天无法在我的机器上运行。

我不确定这是防火墙(我已全部关闭),还是 Docker 设置(因为我刚刚升级到最新的 Docker 版本),还是 Docker SQL Server 问题(但这在同一台机器上运行良好早)。

有人可以帮忙吗?

我尝试过使用 bash,

 /opt/mssql-tools/bin/sqlcmd -S localhost,8010 -U SA -P Test123!

错误:

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。。

docker compose 文件

version: '3'
services:
  mssql:
    network_mode: lsvc
    image: microsoft/mssql-server-linux:2017-latest
    container_name: mssql
    hostname: mssql
    volumes:
      - ./.db:/var/opt/mssql/
      - /var/opt/mssql/data
      - ./sqlinit.sql:/scripts/sqlinit.sql
    ports:
      - 8010:1433
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_SA_PASSWORD=Test123!
    command:
      - /bin/bash
      - -c 
      - |
        # Launch MSSQL and send to background
        /opt/mssql/bin/sqlservr &
        # Wait for it to be available
        echo "Waiting for MS SQL to be available"
        /opt/mssql-tools/bin/sqlcmd -l 30 -S mssql -h-1 -V1 -U sa -P Test123! -Q "SET NOCOUNT ON SELECT \"YAY WE ARE UP\" , @@servername"
        is_up=$$?
        while [ $$is_up -ne 0 ] ; do 
          echo -e $$(date) 
          /opt/mssql-tools/bin/sqlcmd -l 30 -S mssql -h-1 -V1 -U sa -P Test123! -Q "SET NOCOUNT ON SELECT \"YAY WE ARE UP\" , @@servername"
          is_up=$$?
          sleep 1 
        done
        # Run every script in /scripts
        # TODO set a flag so that this is only done once on creation, 
        #      and not every time the container runs
        #for foo in /scripts/*.sql
        /opt/mssql-tools/bin/sqlcmd -S mssql -U sa -P Test123! -l 30 -e -i /scripts/sqlinit.sql
        #done
        # So that the container doesn't shut down, sleep this thread
        sleep infinity

【问题讨论】:

  • 这条线是什么意思:network_mode: lsvc?你可以用host/bridge 测试或者只是注释掉吗?

标签: sql-server docker


【解决方案1】:

我怀疑 mssql 实例启动失败。

当服务器无法启动时查看您的 docker 文件,它会陷入无限循环。我建议您限制循环的重试次数,这样您就会有迹象表明服务器在启动时失败了。 或者更好地考虑使用 HEALTHCHECK 选项而不是循环脚本 见https://blog.couchbase.com/docker-health-check-keeping-containers-healthy/

要解决问题尝试

docker logs <mssql-container-id>

如果这不能提供足够的信息,请尝试连接到容器,因为这是一台简单的机器。

docker exec -it <mssql-container-id> bash

在 /var/opt/mssql/log/errorlog 中查找错误
https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-troubleshooting-guide?view=sql-server-ver15

【讨论】:

  • 这是我提到的日志。没有其他的。 C:\Users\tester>docker logs -f mssql Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL 是否正确
  • docker logs 将显示来自容器的 STDOUT 和 STDERR 的输出。在您的情况下,这是您的 sqlcmd 命令输出。尝试我的第二个选项并查找服务器日志
【解决方案2】:

我找到了根本原因,不是因为docker mssql linux

但最新的 Docker Desktop Community 2.2.0.0

卸载后降级到旧版本,Docker Desktop Community 2.1.0.5。

现在正在工作,连接mssql成功。

不确定最新的 docker 桌面有什么新功能,无论如何...我现在将使用旧版本。

还有一点需要注意,“.db”文件夹(yml 文件所在的 windows 路径)必须在构建 docker 映像之前删除。

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2018-10-07
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多