Галактика плюс mssql-developer в контейнере Docker'а
Добавлено: 16 фев 2020, 01:45
Добрый день. Пытаюсь поднять mssql сервер в контейнере докера, чтобы развернуть на нем базу галактики с напсервером. За основу взял официальный микрософтовский репозитарий mssql-server-windows-developer:latest. Он, если я ничего не напутал, на windows server core. Т.е. rdp нет, только консоль. Нужно установить и запустить на нем napserver. Запилил следующий dockerfile:
Инструкция "COPY ["napsrv", "C:/program files/microsoft sql server/MSSQL14.MSSQLSERVER/mssql/binn"]" копирует dllки и исполняемый файл напсервера в папку, где живет napserver при его установке из ms_inst. Т.е. при старте контейнера имеем все необходимые файлы для установки и запуска napserverа. Порывшись в исходниках базового контейнера я понял, что при старте выполняется powershell скрипт от микрософта. Я добавил в него код для установки и старта службы напсервера:
Тут все просто. Прописываю в реестре параметры напсервера, устанавливаю и стартую службу.
Вот что выдает лог при билде и старте моего контейнера:
Отлично, напсервер работает.
Устанавливаю базу галактики, запустив на хосте ms_inst. База встала.
На хосте запускаю Галактику и... работает. Т.е. к базе конектится, интерфейс Галактики открывается. И тут, как всегда, НО. Галактика запускает проверку реестра настроек при первом запуске и начинают валиться ошибки о том, что нет настройки одной, другой, третьей и т.д. Т.е. явно видно, что у пользователя, под которым я вошел (supervisor), нет доступа к таблицам БД. А это, судя по всему, некорректная работа как раз напсервера. Может кто-то проделывал подобное, подскажите, плз, что я упустил?
Да, вот еще содержимое реестра в контейнере для напсервера:
Код: Выделить всё
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
Код: Выделить всё
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