1

我在使用 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'..

而且它也无法使用相同的凭据通过 DBeaver 从我的远程 PC 连接:

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
4

1 回答 1

0

这里有两个问题:

  1. 环境变量不正确
  2. 不安全的密码字符

如果您查看 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 登录被禁用,密码错误。

发生这种情况是因为您指定了环境变量SA_PASSWORD,而不是MSSQL_SA_PASSWORD在 docker-compose.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.yaml 文件并简单地删除/更新容器不会重置 sa 凭据,之前的配置将保留在./data文件夹中。

于 2021-10-20T22:04:40.420 回答