Как подключиться к серверу MSSQL, работающему внутри контейнера Docker?

#sql-server #linux #docker #docker-compose #ubuntu-21.04

Вопрос:

У меня возникли трудности с сервером MSSQL в Docker. Я создал файл compose, и все начинается нормально, но всякий раз, когда я пытаюсь войти в систему, это не удается. Он не будет подключаться локально с помощью команды 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, используя те же учетные данные:

 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
 

Комментарии:

1. Похоже, у вас нет проблем с самим докером или подключением к сети. Сосредоточьте свой поиск на пароле. Вы указали правильную переменную? Действительно ли установлен пароль, как вы его определили?

2. @HiranChaudhuri Да, в официальной документации переменная пароля — «SA_PASSWORD». Я также обнаружил, что это может быть «MSSQL_SA_PASSWORD», но это тоже не работает.

3. Просто чтобы убедиться, что это не значение пароля: попробуйте использовать примитивный пароль без специальных символов. Я нашел некоторых персонажей, таких как%, удивительно проблематичными. И эта проблема может возникнуть на стороне сервера и клиента…

4. @HiranChaudhuri Они не будут работать, так как, к сожалению, они не соответствуют требованиям к паролям для этой версии MSSQL.

Ответ №1:

Здесь речь идет о двух проблемах:

  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]
 

Похоже, это происходит потому ! , что это специальный символ оболочки. Остановите и удалите контейнер (также удалите ./data папку) и отредактируйте YAML следующим образом:

     environment:
      - "MSSQL_SA_PASSWORD=Lmnt@1991"
      - "ACCEPT_EULA=Y"
      - "TZ=Europe/Belgrade"
 

Теперь, когда вы войдете в систему , используя @ символ вместо ! , вы успешно подключитесь.

ОБРАТИТЕ ВНИМАНИЕ: вам нужно удалить ./data папку между попытками, потому что установка пароля sa происходит только при первом запуске контейнера. Перенастройка докера-составление.файл yaml и простое удаление/увеличение контейнера не приведет к сбросу учетных данных sa, предыдущая конфигурация будет сохранена в ./data папке.

Комментарии:

1. Вы сами пробовали это сделать? Я перепробовал все, что вы сказали, и по какой-то причине все еще получаю ту же ошибку…

2. Да, я это сделал. Хорошо обратите внимание на ЗАПИСКУ . Я не изучал более подробно, где sa хранятся учетные данные — я думаю, что это msdb так, — но, поскольку вы сейчас просто экспериментируете, должно быть безопасно удалить все в ./data папке.