我在Docker上使用MSSQL服务器有困难。我创建了撰写文件,一切正常启动,但每当我尝试登录时,它就失败了。它不会通过docker exec命令在本地连接:
sudo docker exec -it <container_id> /opt/mssql-tools/bin/sqlcmd -S localhost -U sa
Password:
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed for user 'sa'..
并且它也无法使用相同的凭据从我的远程PC通过DBeaver连接:
2021-10-20 16:13:48.22 Logon Error: 18456, Severity: 14, State: 7.
2021-10-20 16:13:48.22 Logon Login failed for user 'sa'. Reason: An error occurred while evaluating the password. [CLIENT: 192.168.1.150]
这是我的docker-compose文件:
services:
mssql:
image: mcr.microsoft.com/mssql/server:2017-latest
container_name: mssql
restart: always
environment:
- "SА_PASSWORD=Lmnt!1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"
ports:
- "1433:1433"
volumes:
- "./data:/var/opt/mssql"
deploy:
resources:
limits:
memory: 4096M
networks:
default:
networks:
default:
name: pyramid
driver: bridge
ipam:
config:
-
subnet: 172.9.9.0/24
gateway: 172.9.9.1
这里有两个问题:
- 环境变量不正确
- 不安全的密码字符
如果你观察你的Docker容器日志,你会看到有用的信息,如:
2021-10-20 23:37:51.74 Logon Error: 18456, Severity: 14, State: 7.
2021-10-20 23:37:51.74 Logon Login failed for user 'sa'. Reason: An error occurred while evaluating the password. [CLIENT: 172.9.9.2]
根据MSSQLSERVER_18456状态7的意思:
7禁止登录,密码错误。
发生这种情况是因为您在docker-compose中指定了环境变量SA_PASSWORD
而不是MSSQL_SA_PASSWORD
。yaml文件。作为第一步,停止并删除容器(也删除./data
文件夹),并编辑YAML如下所示:
environment:
- "MSSQL_SA_PASSWORD=Lmnt!1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"
现在当你登录时,你会看到一个不同的登录错误:
2021-10-20 23:42:26.11 Logon Error: 18456, Severity: 14, State: 8.
2021-10-20 23:42:26.11 Logon Login failed for user 'sa'. Reason: Password did not match that for the login provided. [CLIENT: 172.9.9.2]
这似乎是因为!
是一个特殊的shell字符。停止并删除容器(也删除./data
文件夹),编辑YAML如下所示:
environment:
- "MSSQL_SA_PASSWORD=Lmnt@1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"
现在当您登录时,使用@
字符而不是!
,您将成功连接。
注意:您需要在两次尝试之间删除./data
文件夹,因为sa密码设置只在容器首次启动时发生。重新配置docker-compose。并简单地删除/提升容器将不会重置sa凭证,之前的配置将在./data
文件夹中持久存在。