sql-server - 无法登录 mssql-server-linux 容器中的 SQL Server

标签 sql-server linux bash docker

我不情愿地执行尝试在 docker 容器中使用 Microsoft SQL Server 的耗费灵魂的任务,并且正在使用 Microsoft 提供的 mssql-server-linux 盒子。但无论我做什么我都无法登录。

这是我的 docker-compose.yml 文件:

version: '2'

services:
  db:
    build:
      context: ./docker/db
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "My@Super@Secret"
    expose:
      - 1433

这是我的 Dockerfile:

FROM microsoft/mssql-server-linux

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY startup.sh setup.sql ./

CMD /bin/bash ./startup.sh

这是我的startup.sh:

/opt/mssql/bin/sqlservr & /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "My@Super@Secret" -d master -i setup.sql

这是我的 setup.sql:

CREATE DATABASE DemoData;

每次尝试使用此入口点启动容器都会导致此错误:

SQL Server is now ready for client connections. This is an informational message; no user action is required.
2017-09-27 17:30:00.85 spid10s     Polybase feature disabled.
2017-09-27 17:30:00.85 spid10s     Clearing tempdb database.
2017-09-27 17:30:01.09 Logon       Error: 18456, Severity: 14, State: 7.
2017-09-27 17:30:01.09 Logon       Login failed for user 'sa'. Reason: An error occurred while evaluating the password. [CLIENT: 172.19.0.2]
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login failed for user 'sa'..
db_1     | Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749.
db_1     | Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

显然,删除入口点、进入/bin/bash 并运行命令或尝试手动连接命令会产生相同的结果。我尝试过多种不同的密码。

我讨厌微软...提前致谢!

最佳答案

您将使用 & 在后台启动 SQL Server。因此,您的 sqlcmd 将在启动 SQL Server 后立即启动,而不是等到它准备好接受连接。

通常,您可以使用双与号 && 来解决此问题。通过使用 &&,在第一个命令成功完成之前,第二个命令不会启动。但是,SQL Server 是一个长时间运行的进程,因此您的第二个命令永远不会启动。

您可以通过在启动 SQL Server 后添加 sleep 命令来解决此问题。

/opt/mssql/bin/sqlservr & sleep 30 && /opt/mssql-tools/bin/sqlcmd -S localhost etc.

sqlcmd 将在启动 SQL Server 后 30 秒执行。如果 SQL Server 仍然不可用,请尝试延长 sleep 时间。

sqlcmd 完成后,docker 容器将停止,因为不再有前台进程。 SQL Server 正在后台运行,而 docker 需要一个事件的前台进程。

添加wait命令以再次开始等待SQL Server进程。

/opt/mssql/bin/sqlservr & sleep 30 && /opt/mssql-tools/bin/sqlcmd -S localhost etc. && wait

免责声明 我自己刚刚开始使用 Linux 和 Docker,所以可能会有更好的解决方案。

关于sql-server - 无法登录 mssql-server-linux 容器中的 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46453969/

相关文章:

sql-server - SQL Server : preventing dirty reads in a stored procedure

linux - PC 未自动与 NTP 服务器同步时间 (Centos 6)

bash - 无法写入Docker Maven容器中的〜/.m2

bash - [] 和 () 在 "if"条件下的区别

c# - 在 C# 中,如何在 SQL Server 中查找表的列名?

mysql - 执行sql server插入,但如果发现重复则执行更新

c++ - 尽管在 bash 中通过管道重定向,仍写入终端

Bash:在执行 bash 之前等待产生的子进程

SQL错误: The executeQuery method must return a result set

linux - 使用 sudo 执行时脚本不起作用