Я хочу решить проблемы с памятью, которые возникают у моего контейнерного SQL Server. Я использую это в Windows 10 версии 1709.
Для тестирования я создал контейнер SQL Server с помощью этой команды:
docker run -d -p 1433:1433 --name sql1 -e SA_PASSWORD=1Secure*Password1
-e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer:2017-latest
В этом контейнерном экземпляре SQL я создал базу данных, которая работала до тех пор, пока не стала слишком большой. Я получаю ошибки нехватки памяти. Например, когда я запускаю запрос в SSMS, я получаю сообщение «Недостаточно системной памяти в пуле ресурсов по умолчанию для выполнения этого запроса». Точно так же, когда я проверяю кольцевой буфер SQL Server, я вижу RESOURCE_MEMPHYSICAL_LOW. Когда я получаю эти ошибки, используется только 8 гигабайт из доступных 16 гигабайт оперативной памяти моего ноутбука. Так что это не проблема с реальной физической памятью.
Docker для Windows в Windows 10 запускает контейнеры на виртуальной машине Hyper-V, для которой по умолчанию установлено 1 ГБ ОЗУ. Я могу подтвердить это, запустив свой контейнер, а затем войдя с ним в интерактивный режим:
PS C:\repos\somefolder> docker exec -it sql1 powershell
В интерактивном режиме, следуя этот другой пример SO, я вижу следующие результаты:
PS C:\> systeminfo | findstr "Memory"
Total Physical Memory: 1,023 MB
Available Physical Memory: 221 MB
Virtual Memory: Max Size: 1,023 MB
Virtual Memory: Available: 82 MB
Virtual Memory: In Use: 941 MB
Кроме того, когда я запускаю docker stats, я вижу, что мой контейнер sql1 использует PRIV WORKING SET в диапазоне от 750 МБ до 970 МБ.
Итак, я четко подтвердил, что у меня есть ограничение на виртуальную машину Hyper-V в 1 ГБ, которое мне нужно поднять.
Как мне это сделать, не потеряв базу данных, которая находится внутри этого контейнера? Я вижу ответ, в котором написано опция "использовать -m", но я думаю, что это работает только при первом создании контейнера.
Версия Докера
$ docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:12:48 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.24)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:21:42 2018
OS/Arch: windows/amd64
Experimental: false





Образы SQL Server позволяют подключать базы данных в формате JSON, заданном как переменная среды attach_dbs.
Я сделал что-то вроде этого:
# escape=`
FROM microsoft/mssql-server-windows-express:2017-GA
LABEL MAINTAINER = "Seba Gómez @sebagomez"
# SQL Databases
COPY data\ c:/data
ENV attach_dbs = "[{'dbName':'MyDB','dbFiles':['C:\\data\\MyDB.mdf','C:\\data\\MyDB_log.ldf']}, {'dbName':'MyOtherDB','dbFiles':['C:\\data\\MyOtherDB.mdf','C:\\data\\MyOtherDB_log.ldf']}]" `
ACCEPT_EULA=Y `
sa_password = "dbPassword!"
Все файлы mdf и ldf находятся в папке data рядом с моим файлом dockerfile.