Предварительная загрузка данных в SQL Server docker образ при запуске - PullRequest
1 голос
/ 08 января 2020

Я создаю файл docker -compose.yml с несколькими различными службами. Одним из таких сервисов является SQL Сервер.

Моя цель состоит в том, чтобы раскрутить контейнер и заставить систему автоматически восстанавливать резервную копию базы данных. Я использую образец резервной базы данных Microsoft "Wide World Importers" (https://docs.microsoft.com/en-us/sql/samples/wide-world-importers-what-is?view=sql-server-ver15) в качестве моего .bak файла.

Вот мой yaml:

version: "3"
services:

  sql:
    build: ./build/sql
    container_name: sql
    hostname: sql
    networks:
      - network
    ports:
      - "1433:1433"
    volumes:
      - "./data:/data"

networks:
  network:

... и мой Dockerfile:

FROM mcr.microsoft.com/mssql/server:2019-latest

ENV SA_PASSWORD [my password]
ENV ACCEPT_EULA Y
ENV MSSQL_AGENT_ENABLED true
ENV MSSQL_PID Express

EXPOSE 1433

CMD ["/data/restore.sh"]

И, наконец, мое восстановление. sh.

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[my password]' -Q 'RESTORE FILELISTONLY FROM DISK = "/data/WideWorldImporters-Full.bak"' | tr -s ' ' | cut -d ' ' -f 1-2
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[my password]' -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/data/WideWorldImporters-Full.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'

Я могу s sh в контейнер после его запуска и запустите скрипт восстановления, который в итоге восстанавливает базу данных просто отлично. Я знаю, что части этой работы. Сам контейнер самостоятельно работает. Скрипт восстановления работает. Соединить все вместе не получается.

Что я делаю не так? Я подхожу к этому неправильно? Как правильно развернуть серверный контейнер SQL с уже имеющимися данными?

Любая помощь приветствуется! Спасибо всем!

[РЕДАКТИРОВАТЬ] . Полный вывод команды docker -compose up:

Creating network "retention_network" with the default driver
Building sql
Step 1/7 : FROM mcr.microsoft.com/mssql/server:2019-latest
2019-latest: Pulling from mssql/server
59ab41dd721a: Pull complete
57da90bec92c: Pull complete
06fe57530625: Pull complete
5a6315cba1ff: Pull complete
739f58768b3f: Pull complete
3a58fde0fc61: Pull complete
89b44069090d: Pull complete
9d86d733b28b: Pull complete
725e4eb49e7e: Pull complete
Digest: sha256:bbc6d638724b4604ab1201e89e006dcec9efdbced5ff23b680321c1bc6724c2a
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-latest
 ---> d273eadd9675
Step 2/7 : ENV SA_PASSWORD [My password]
 ---> Running in c5db5b3dbd46
Removing intermediate container c5db5b3dbd46
 ---> aaae9a242b75
Step 3/7 : ENV ACCEPT_EULA Y
 ---> Running in e7ca97135ff9
Removing intermediate container e7ca97135ff9
 ---> e2d5b4f405f5
Step 4/7 : ENV MSSQL_AGENT_ENABLED true
 ---> Running in f207cad20367
Removing intermediate container f207cad20367
 ---> 99774f595780
Step 5/7 : ENV MSSQL_PID Express
 ---> Running in 4e60c45eda89
Removing intermediate container 4e60c45eda89
 ---> 0137124525dc
Step 6/7 : EXPOSE 1433
 ---> Running in 92ecccf4bc31
Removing intermediate container 92ecccf4bc31
 ---> 79e4778f8b02
Step 7/7 : CMD ["/data/restore.sh"]
 ---> Running in c9278fbd3b6b
Removing intermediate container c9278fbd3b6b
 ---> 287f7f95793a
Successfully built 287f7f95793a
Successfully tagged retention_sql:latest
WARNING: Image for service sql was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating sql ... done
Attaching to sql
sql    | SQL Server 2019 will run as non-root by default.
sql    | This container is running as user mssql.
sql    | To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
sql exited with code 1

1 Ответ

0 голосов
/ 08 января 2020

Думаю, проблема в том, что, как это написано в настоящее время, сценарий restore.sh успешно завершается, а затем контейнер завершается (что и должно происходить). Контейнеры Docker живут только до тех пор, пока эта команда продолжает выполняться. Я бы перестроил это так:

RUN /data/restore.sh
[CMD "<DB command>"]

Данные будут заполнены отдельным слоем изображения, который будет включен в окончательное изображение, которое будет использоваться для запуска контейнера. Но команда, которая запускается, <db command>, должна запустить СУБД, а затем , а не return, потому что, как только эта команда вернется, контейнер остановится.

Я попытался запустить с копированием / вставкой вашего docker-compose.yml файла и этого Dockerfile:

FROM mcr.microsoft.com/mssql/server:2019-latest
CMD ["/opt/mssql/bin/sqlservr", "--accept-eula"]

Это сработало для меня.

Как альтернатива, вы может сохранить restore.sh как CMD, но затем добавить /opt/mssql/bin/sqlservr --accept-eula в конце этого скрипта. Это запустит базу данных после завершения восстановления и предотвратит выход контейнера.

...