无法在MSSQL-Server-Linux容器中登录SQL Server



我很高兴地执行试图在Docker容器中使用Microsoft SQL Server的灵魂耗尽的任务,并且正在使用Microsoft提供的MSSQL-Server-Linux Box。但是无论我做什么,我都无法登录。

这是我的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

这是我的启动。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后立即启动,而不要等到它准备好接受连接。

通常,您可以使用Double Ampersand &&解决此问题。通过使用&&,第二个命令在第一个命令成功完成之前就不会启动。但是,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自己合作,因此可能会有更好的解决方案。

./startup.sh是否已执行权限?

您可以找出是否运行docker-compose up,而不是docker-compose up -d


这是一个想法(受此答案的启发):

在构建图像之前,请先设置执行权限:

chmod +x ./startup.sh
docker build .

Docker复制文件时将保留./startup.sh的执行权限。

最新更新