В нашей компании мы хотели проводить тесты как можно максимально, как в наших локальных компьютерах DEV, работающие на Windows, так и в нашем трубопроводе: действие GitHub с последним Ubuntu ( https://github.com/virt/virtual-environments/BLOB/MAIN/Images/linux/ubuntu2004-radme.md ), и это включает в себя достижение на реальный SQL Server DB, поэтому мы могли бы проверить наши запросы, а таблицы работают нормально.
Мы обнаружили, что супер сложные для создания решения, работающего в Windows, так и в Linux, много онлайн-предложений, похоже, больше не работают, так что нас возглавило, чтобы выработать его, но мы, наконец, удалось, чтобы мы решили поделиться с Мир.
Это все шаги, которые мы следили:
Резервное копирование БД обычно огромен, и нам нужно хранить его в Github и переместить его вокруг, поэтому мы хотим, чтобы он сжал. Команда TAR соответствует требованию и работает в Windows 10 из коробки ( https://superuser.com/a/1515028):
tar -cvzf mvc_db_2021-08-25.tar.gz mvc_db.bak
Чтобы иметь возможность делиться доступом к нему, мы создали папку с именем «SQL_SERVER_BACKUP».
Что затем совместно используются по объему в Docker-Compose, упрощенном примере:
version: '3.9' services: tests: image: my-special-web-project-with-db-backup depends_on: - db volumes: - ./sql_server_backup:/sql_server_backup db: image: mcr.microsoft.com/mssql/server:2019-latest volumes: - ./sql_server_backup:/sql_server_backup volumes: sql_server_backup:
В нашем корневой папке Reppo мы создали Set-local-environment.sh:
#!/bin/bash -e docker-compose -f docker-compose-infra.yml up -d cd sql_server_backup tar -xzvf *.tar.gz # docker attach allow us to the logs inside the container, VERY useful for debugging #docker attach db_1 echo "Docker compose finished running"
Порядок порядка команд вполне важен, мы хотим, чтобы Docker составлял сначала поступить, как запуск экземпляра SQL Server может занять некоторое время, тем временем мы распадаемся резервным копированием
Этот шаг был самым сложным, так как существует проблема с синхронизацией, SQL Server может предпринять некоторое время, чтобы быть готовым к использованию, а рекомендации использовать сценарии, такие как wait-for-it.sh, не работали на нас. То, что работало использовало механизм проверки здоровья, который регулярно проходит регулярно, если БД не готов начать восстановление, он снова старается немного позже. Вот соответствующий раздел в Docker-Compose:
version: '3.9' services: db: image: mcr.microsoft.com/mssql/server:2019-latest environment: MSSQL_SA_PASSWORD: Password123 ACCEPT_EULA: Y MSSQL_PID: Express healthcheck: # copied / adapted from https://github.com/Microsoft/mssql-docker/issues/133, leveraging https://docs.docker.com/engine/reference/builder/#healthcheck test: sh /sql_server_backup/RestoreDb.sh interval: 10s timeout: 10s retries: 10 start_period: 45s ports: - "1433:1433" volumes: - ./sql_server_backup:/sql_server_backup
RESTOREDB.SH:
#!/bin/bash -e /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "Password123" -i /sql_server_backup/RestoreDb.sql
RESTOREDB.SQL (с небольшим количеством отладки логики):
-- this file will be called from the docker compose health check if exists ( select 1 from sys.databases where [name] = 'MvcDocker' ) begin EXEC xp_logevent 60000, 'RestoreDb.sql: MvcDocker database already exists, no need to run again', informational; return -- already run end EXEC xp_logevent 60000, 'RestoreDb.sql: Started script', informational; -- begin write to log the list of files in our folder of interest declare @ss table ([filename] varchar(1000), depth int, [file] int) insert into @ss EXEC xp_dirtree '/sql_server_backup/', 2, 1 -- list all files in our folder of interest (https://stackoverflow.com/a/13594903) declare @msg varchar(2000) = 'RestoreDb.sql: Files found in /sql_server_backup/: ' select @msg = @msg + [filename] + ',' from @ss EXEC xp_logevent 60000, @msg, informational; -- end write to log the list of files in our folder of interest GO -- restore the backup, to names and folder that make sense here RESTORE DATABASE MvcDocker FROM DISK='/sql_server_backup/mvc_db.bak' WITH MOVE 'OriginalFileName' TO '/var/opt/mssql/data/MvcDocker.mdf', MOVE 'OriginalFileName_log' TO '/var/opt/mssql/data/MvcDocker_log.ldf' GO use MvcDocker GO -- check if the restored DB works as expected select top 5 DisplayName from [SomeTableFromYourDb]
В нашем случае мы использовали .NET И только наши тесты интеграции нуждались в БД, поэтому мы проводим его последний, упрощенный пример:
jobs: build_and_test_and_publish: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Create folder BuildReports run: mkdir BuildReports - name: DotNet restore run: dotnet restore --verbosity m > BuildReports/Restore.txt - name: DotNet build run: dotnet build --no-restore --verbosity m --configuration Release /nowarn:CS1591 /p:Version=$NUGET_PACKAGE_VERSION > BuildReports/Build.txt - name: DotNet unit tests run: dotnet test --no-build --configuration Release --filter=Type=Unit > BuildReports/UnitTests.txt - name: Docker setup run: sh ./set-local-environment.sh > BuildReports/DockerSetup.txt - name: DotNet integration tests run: dotnet test --no-build --configuration Release --filter=Type=Integration > BuildReports/IntegrationTests.txt
Попробуйте это окно на своем докере, это то, что вы должны увидеть, если каждый работает как ожидается
Вы заметите, что база данных сообщений уже существует, когда будет отображаться, это потому, что Concept Check Compose Compose продолжает работать без остановки. Сначала наша команда проверки здоровья не будет работать, потому что, пока сам контейнер «готов», сервер SQL внутри него все еще загружается, поэтому команда не работает. Когда SQL Server готов, следующая итерация команды проверки здоровья будет работать, и БД будет восстановлен. В следующей итерации проверки здоровья, БД будет уже восстановлен, поэтому мы начнем видеть базу данных сообщения уже существующей ».
Мы ищем талантливых программных инженеров, пожалуйста, посмотрите на https://clientapps.jobadder.com/30580/bizward.
Оригинал: «https://dev.to/alansarligithub/restoring-an-sql-server-backup-in-a-docker-container-1knb»