无法在mssql-server-linux容器中login到SQL Server

我很勉强地执行试图在Docker容器中使用Microsoft SQL Server的灵魂消耗任务,并使用Microsoft提供的mssql-server-linux框。 但是无论我做什么,我都无法login。

这是我的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后,可以通过添加睡眠命令来解决此问题。

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

启动SQL server后,sqlcmd将执行30秒。 如果SQL server仍然不可用,请尝试提高睡眠时间。

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,所以可能会有更好的解决方案。