Как восстановить базу данных SQL Server при запуске контейнера Docker? - PullRequest
0 голосов
/ 22 мая 2019

Я создаю собственный образ Docker из существующего mcr.microsoft.com/mssql/server:2017-latest-ubuntu, добавляя некоторые базы данных с помощью Flyway, а затем создаю резервные копии баз данных в контейнере.

Идея состоит в том, чтобы запустить контейнер Docker и импортировать все базы данных из файлов резервных копий, найденных в определенном каталоге.

Если моя точка входа в Docker просто запускается sqlservr, а затем я exec сценарии оболочки, которые восстанавливают БД извне, все работает (за исключением того, что иногда SQL Server работает, но на самом деле нет).

Согласно https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-docker?view=sql-server-2017#customcontainer, я должен запустить свои сценарии оболочки до запуска sqlservr, так как это процесс переднего плана, который определяет, запущен контейнер или нет.

Но это сложная ситуация: как я могу выполнять команды SQL в своих сценариях оболочки до запуска SQL Server?

Я знаю, что обычно можно сделать это с томом, но это тестовая база данных, и мне все равно, что произойдет с данными после завершения теста.

Вот мой сценарий точки входа Docker (у меня есть несколько пользовательских сценариев в /opt/mssql-tools/bin/):

#!/bin/sh

if ! whoami &> /dev/null; then
  if [ -w /etc/passwd ]; then
    echo "${USER_NAME:-sqlservr}:x:$(id -u):0:${USER_NAME:-sqlservr} user:${HOME}:/sbin/nologin" >> /etc/passwd
  fi
fi
/opt/mssql-tools/bin/restore-databases.sh & sqlservr

Спасибо за любые подсказки и предложения о том, каким должен быть "путь Docker".

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Вот то, что я делаю со своей стороны, это не идеально, так как включает функцию «сна» для ожидания запуска и запуска сервера SQL перед выполнением SQL ... но это работает.

У меня следующая структура папок:

  • Dockerfile
  • INIT /
    • database.sql
    • entrypoint.sh
    • setup.sh

Мой Dockerfile вызывает мой entrypoint.sh следующим образом:

FROM microsoft/mssql-server-linux:latest

# Project files
ARG PROJECT_DIR=/srv/db-sql-server
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR
COPY ./init/ ./

# Grant permissions for scripts to be executable
RUN chmod +x $PROJECT_DIR/entrypoint.sh
RUN chmod +x $PROJECT_DIR/setup.sh

CMD ["/bin/bash", "entrypoint.sh"]

My entrypoint.sh запускает SQL Server, вызывает другой настраиваемый сценарий оболочки setup.sh для настройки базы данных, а затем поддерживает работу контейнера:

#start SQL Server, start the script to create the DB and import the data, start the app
/opt/mssql/bin/sqlservr & ./setup.sh & sleep infinity & wait

Мой пользовательский сценарий оболочки setup.sh ждет 30 секунд, пока SQL Server будет запущен и работает, а затем выполняет мой файл SQL database.sql, чтобы создать базу данных / восстановить данные:

# Wait for SQL Server to be started
sleep 30s

# Run the setup script to create the database
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -d master -i database.sql
0 голосов
/ 22 мая 2019

Бьюсь об заклад, sp_procoption может работать в вашем случае. Это позволяет назначить хранимую процедуру для запуска при каждом запуске экземпляра и после монтирования всех баз данных, и реляционный механизм начинает прослушивать команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...