Страница 1 из 1

Галактика плюс mssql-developer в контейнере Docker'а

Добавлено: 16 фев 2020, 01:45
mwoland
Добрый день. Пытаюсь поднять mssql сервер в контейнере докера, чтобы развернуть на нем базу галактики с напсервером. За основу взял официальный микрософтовский репозитарий mssql-server-windows-developer:latest. Он, если я ничего не напутал, на windows server core. Т.е. rdp нет, только консоль. Нужно установить и запустить на нем napserver. Запилил следующий dockerfile:

Код: Выделить всё

FROM microsoft/mssql-server-windows-developer:latest

ENV sa_password="_" \
    attach_dbs="[]" \
    ACCEPT_EULA="_" \
    sa_password_path="C:\ProgramData\Docker\secrets\sa-password"

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

COPY ["napsrv", "C:/program files/microsoft sql server/MSSQL14.MSSQLSERVER/mssql/binn"]

COPY start.ps1 /

CMD .\start -sa_password $env:sa_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs \"$env:attach_dbs\" -Verbose
Инструкция "COPY ["napsrv", "C:/program files/microsoft sql server/MSSQL14.MSSQLSERVER/mssql/binn"]" копирует dllки и исполняемый файл напсервера в папку, где живет napserver при его установке из ms_inst. Т.е. при старте контейнера имеем все необходимые файлы для установки и запуска napserverа. Порывшись в исходниках базового контейнера я понял, что при старте выполняется powershell скрипт от микрософта. Я добавил в него код для установки и старта службы напсервера:

Код: Выделить всё

Write-Verbose "Creating NapServer service"

new-service -name "NAPServer" -binarypathname "C:\program files\microsoft sql server\MSSQL14.MSSQLSERVER\mssql\binn\Galaktika\napsrv.exe"

Write-Verbose "Prepare NAPServer registry"

$regkey="HKLM:\system\controlset001\services\napserver"

set-itemproperty -path $regkey -name AuthnLevel -value 0
set-itemproperty -path $regkey -name AuthnOnly -value 0
set-itemproperty -path $regkey -name LoginId -value sa
set-itemproperty -path $regkey -name Password -value Password_01
set-itemproperty -path $regkey -name Port -value "1997"
set-itemproperty -path $regkey -name Protocol -value ncacn_ip_tcp

Write-Verbose "Starting NapServer"

start-service NAPServer

Write-Verbose "NAPServer is UP"
Тут все просто. Прописываю в реестре параметры напсервера, устанавливаю и стартую службу.
Вот что выдает лог при билде и старте моего контейнера:

Код: Выделить всё

PS D:\docker\compose\gal> docker-compose up
Recreating gal_gal_1 ... done                                                                                           
Attaching to gal_gal_1
gal_1  | VERBOSE: Starting SQL Server
gal_1  | VERBOSE: Changing SA login credentials
gal_1  | VERBOSE: Attaching 1 database(s)
gal_1  | VERBOSE: Invoke-Sqlcmd -Query IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME
gal_1  |  = 'test') BEGIN EXEC sp_detach_db [test] END;CREATE DATABASE [test] ON
gal_1  | (FILENAME = N'C:\SQLData\testData.dat'),(FILENAME =
gal_1  | N'C:\SQLData\testIndex.dat'),(FILENAME =
gal_1  | N'C:\SQLData\testJournal.dat'),(FILENAME = N'C:\SQLData\testLog.dat'),(FILENAME
gal_1  |  = N'C:\SQLData\testSystem.dat') FOR ATTACH;
gal_1  | VERBOSE: Started SQL Server.
gal_1  | VERBOSE: Creating NapServer service
gal_1  |
gal_1  | Status   Name               DisplayName
gal_1  | ------   ----               -----------
gal_1  | Stopped  NAPServer          NAPServer
gal_1  | VERBOSE: Prepare NAPServer registry
gal_1  | VERBOSE: Starting NapServer
gal_1  | VERBOSE: NAPServer is UP
Отлично, напсервер работает.
Устанавливаю базу галактики, запустив на хосте ms_inst. База встала.
На хосте запускаю Галактику и... работает. Т.е. к базе конектится, интерфейс Галактики открывается. И тут, как всегда, НО. Галактика запускает проверку реестра настроек при первом запуске и начинают валиться ошибки о том, что нет настройки одной, другой, третьей и т.д. Т.е. явно видно, что у пользователя, под которым я вошел (supervisor), нет доступа к таблицам БД. А это, судя по всему, некорректная работа как раз напсервера. Может кто-то проделывал подобное, подскажите, плз, что я упустил?

Да, вот еще содержимое реестра в контейнере для напсервера:

Код: Выделить всё

cd HKLM:\system\controlset001\services\napserver
PS HKLM:\system\controlset001\services\napserver> get-itemproperty .


Type         : 16
Start        : 2
ErrorControl : 1
ImagePath    : C:\program files\microsoft sql server\MSSQL14.MSSQLSERVER\mssql\binn\Galaktika\napsrv.exe
ObjectName   : LocalSystem
AuthnLevel   : 0
AuthnOnly    : 0
LoginId      : sa
Password     : Password_01
Port         : 1997
Protocol     : ncacn_ip_tcp
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\system\controlset001\services\napserver
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\system\controlset001\services
PSChildName  : napserver
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

Re: Галактика плюс mssql-developer в контейнере Docker'а

Добавлено: 16 фев 2020, 17:27
edward_K
Если бы у вас были бы проблемы с naps галактика бы вообще бы не стартанула.
1. Всегда смотрите MS70DRV.log
2. Начните все таки с сапорта. Для начала в "Права доступа" - будет ругаться, значит вы не админ.
Если вы базу переносили с другого сервера( еще и с включенным протектом), то в i_sql есть инстра как правильно это делать. И проверьте под кем зашли - Ctrl+F4 -> UserName. Насколько помню в той инстре нужно войти с новым пользователем - тогда напс ему создаст роли в автомате(если протект не включен разумеется).
3. Также внимательно посмотрите в Studio x$users и сравните роли зверя здесь и на обычном сервере. Руками в ролях не советую ковыряться, если вы не в совершенстве понимаете что к чему.
Возможно могут быть проблемы если вы же выступаете и владельцем базы.
4. Раз вы вошли, значит ODBC тоже работает.
5. Раньше naps очень не любил, когда стартовали отдельно от SQL - вопрос решался только перезагрузкой сервака.
6. События винды и SQL тоже не лишне посмотреть. Первого у вас так понимаю нет, но мож SQL в свои что то записал.

Re: Галактика плюс mssql-developer в контейнере Docker'а

Добавлено: 18 фев 2020, 14:50
mwoland
Эдуард, привет. Спасибо за ответ. Проблема в аттаче базы после старта контейнера. Т.к. контейнер каждый раз стартует с нуля и к sql серверу потом аттачится бд, все логины на уровне sql сервера отсутствуют. Например, dbo в приаттаченной базе ссылается на несуществующий логин. Проблема в этом. Пробовал sp_changedbowner, пока не помогло, но копаю в этом направлении.

Re: Галактика плюс mssql-developer в контейнере Docker'а

Добавлено: 19 фев 2020, 04:00
mwoland
Проблема была в системных расширенных процедурах в master, которые регистрируются ms_inst'ом (na_forcefreedb и т.п.). Сделал скрипты их регистрации при старте контейнера и все заработало.