SQL Server و Flyway: یک رویکرد Docker

برای یک پروژه شخصی میخواستم یک محیط توسعه با ویژگیهای زیر ایجاد کنم: راهاندازی آسان، نگهداری آسان و اشتراکگذاری آسان با هم تیمیهایم. با حل این مشکل، بلافاصله سه ابزار به ذهن من رسید: Docker، SQL Server و Flyway.
در این مقاله توضیح خواهم داد که چگونه آنها را به هم چسباندم تا یک محیط توسعه انعطاف پذیر ایجاد کنم.
بیایید در آن شیرجه بزنیم!
TLTR
اگر دوست دارید SQL Server و Flyway را با Docker راه اندازی کنید:
- این مخزن را شبیه سازی کنید.
- ایجاد کنید
.env
فایل در سطح ریشه در آن متغیرهای محیطی که در آن استفاده خواهند شد را تعریف کنیدdocker-compose.yaml
فایل. توجه داشته باشید: کلیدهایی که استفاده می کنید باید مطابق با موارد استفاده شده درdocker-compose.yaml
فایل. - فایل پیکربندی Flyway را در آن تغییر دهید
flyway/conf
پوشه با پارامترهای شما توجه داشته باشید: نام میزبان پایگاه داده باید مطابق با نام سرویس SQL Server درdocker-compose.yaml
فایل. - فایل های مهاجرت خود را در آن قرار دهید
flyway/sql
پوشه - یک پنجره ترمینال را باز کرده و اجرا کنید
docker compose up -d
.
ساختار پروژه
ساختار پروژه به شرح زیر است:
project-folder/
├─ db/
│ ├─ scripts/
│ │ ├─ entrypoint.sh
│ │ ├─ db-init.sh
│ │ ├─ init.sql
├─ flyway/
│ ├─ conf/
│ │ ├─ flyway.conf
│ ├─ sql/
│ │ ├─ <migrations goes here>
├─ docker-compose.yaml
-
db/scripts
پوشه حاوی مجموعهای از اسکریپتهای پوسته و SQL است که در مرحله تنظیم اولیه کانتینر SQL Server استفاده میشوند. -
flyway
پوشه حاوی اطلاعات مورد نیاز Flyway است: فایل های پیکربندی و مهاجرت. -
docker-compose.yaml
فایل کامپوزی Docker است که در آن کانتینرهای SQL Server و Flyway تعریف و به هم مرتبط می شوند.
فایل نوشتن
را docker-compose.yaml
فایل جایی است که محیط توسعه به طور رسمی توضیح داده شده است و شبیه قطعه کد زیر است:
version: '3'
services:
db:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: sqlserver-2022-database
command: /bin/bash /scripts/entrypoint.sh
volumes:
- dbdata:/var/opt/mssql
- ./db/scripts:/scripts
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=${DB_PASSWORD}
ports:
- 1433:1433
flyway:
image: redgate/flyway
container_name: flyway
command: migrate -user=${DB_USER} -password=${DB_PASSWORD} -connectRetries=60
volumes:
- ./flyway/conf/:/flyway/conf
- ./flyway/sql/:/flyway/sql
depends_on:
- db
volumes:
dbdata:
دو سرویس در فایل تعریف شده است، یکی برای ظرف SQL Server (db
) و دیگری برای کانتینر فلای وی (flyway
). آنها هر دو از حجم ها برای ماندگاری داده ها و کپی فایل ها از دستگاه میزبان در خود کانتینرها استفاده می کنند. به ویژه، کپی های سرویس SQL Server scripts
پوشه؛ در حالی که Flyway یکی را متصل می کند conf
و sql
دایرکتوری ها
تا اینجا چیز خاصی نیست
قبل از راهاندازی خدمات ما باید در نظر گرفت که برای اعمال مهاجرت، Flyway به دنبال یک میگردد پایگاه داده موجود. متأسفانه بار اول که کانتینرهای ما اجرا می شوند، این شرط برآورده نمی شود. بنابراین، برای خودکارسازی کامل محیط توسعه، یک روش اولیه سازی مورد نیاز است.
روش اولیه سازی
ترتیب عملیات مورد نظر به شرح زیر است:
- کانتینر SQL Server را راه اندازی کنید.
- پایگاه داده و طرح مورد نظر را ایجاد کنید (اگر وجود نداشته باشد).
- کانتینر Flyway را راه اندازی کنید و مهاجرت ها را به پایگاه داده اعمال کنید.
همه چیز با entrypoint.sh
فایل، که زمانی اجرا می شود که db
خدمات شروع می شود (به command
تگ تعریف شده برای آن در فایل نوشتن).
در زیر تعریف شده است:
chmod +x /scripts/db-init.sh & \
/scripts/db-init.sh & \
/opt/mssql/bin/sqlservr
در اینجا سه اتفاق در حال رخ دادن است. اول از همه، مجوز اجرا به db-init.sh
فایل (ما در یک ثانیه به آن شیرجه می زنیم). سپس، db-init.sh
اجرا می شود و در نهایت SQL Server راه اندازی می شود.
توجه به آن مهم است
db-init.sh
و SQL Server به صورت موازی اجرا می شوند.
در این مرحله، وقت آن است که پایگاه داده خود را مقداردهی اولیه کنیم! و این دقیقاً همان چیزی است db-init.sh
میکند.
sleep 30s
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${MSSQL_SA_PASSWORD} -d master -i /scripts/init.sql
اسکریپت مدت زمان ثابتی (در این مورد 30 ثانیه) منتظر می ماند تا مطمئن شود که SQL Server راه اندازی و اجرا می شود. سپس اسکریپت SQL تعریف شده در آن را اجرا می کند init.sql
فایل. اسکریپت بسیار ساده است، در واقع بررسی می کند که پایگاه داده وجود داشته باشد و اگر وجود نداشته باشد آن را ایجاد می کند:
IF DB_ID('<YOUR_DB_NAME>') IS NULL
CREATE DATABASE [YOUR_DB_NAME];
GO
USE [YOUR_DB_NAME];
GO
CREATE SCHEMA YOUR_SCHEMA;
GO
و این روش اولیه سازی است. به لطف آن هنگامی که ظرف SQL Server برای اولین بار راه اندازی می شود، همه چیز به طور خودکار تنظیم می شود.
در این مرحله، کانتینرهای ما در نهایت می توانند با docker compose up
فرمان پس از اتمام آنها، اگر به گزارش های کانتینر Flyway نگاه کنید، می توانید متوجه شوید که در ابتدا به پایگاه داده متصل نمی شود: این به این دلیل است که ظرف SQL Server هنوز در حال راه اندازی است. با وجود این، پس از مدتی، اسکریپتهای مهاجرت با موفقیت اجرا میشوند: رویه مقداردهی اولیه کار خود را انجام داد. شما می توانید خود را با اتصال به پایگاه داده خود تأیید کنید!
نتیجه
قرار دادن SQL Server و Flyway در کنار هم به روش Docker-friendly چیز خاصی نیست. در عین حال، این یک عملیات ظریف است که نیاز دارد ظرف SQL Server برای اجرای Flyway آماده باشد. با تعداد زیادی اسکریپت و کمی همگام سازی بین کانتینرها، محیط توسعه شما برای پروژه های عالی شما آماده است.