برنامه نویسی

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

برای یک پروژه شخصی می‌خواستم یک محیط توسعه با ویژگی‌های زیر ایجاد کنم: راه‌اندازی آسان، نگهداری آسان و اشتراک‌گذاری آسان با هم تیمی‌هایم. با حل این مشکل، بلافاصله سه ابزار به ذهن من رسید: Docker، SQL Server و Flyway.

در این مقاله توضیح خواهم داد که چگونه آنها را به هم چسباندم تا یک محیط توسعه انعطاف پذیر ایجاد کنم.

بیایید در آن شیرجه بزنیم!

TLTR

اگر دوست دارید SQL Server و Flyway را با Docker راه اندازی کنید:

  1. این مخزن را شبیه سازی کنید.
  2. ایجاد کنید .env فایل در سطح ریشه در آن متغیرهای محیطی که در آن استفاده خواهند شد را تعریف کنید docker-compose.yaml فایل. توجه داشته باشید: کلیدهایی که استفاده می کنید باید مطابق با موارد استفاده شده در docker-compose.yaml فایل.
  3. فایل پیکربندی Flyway را در آن تغییر دهید flyway/conf پوشه با پارامترهای شما توجه داشته باشید: نام میزبان پایگاه داده باید مطابق با نام سرویس SQL Server در docker-compose.yaml فایل.
  4. فایل های مهاجرت خود را در آن قرار دهید flyway/sql پوشه
  5. یک پنجره ترمینال را باز کرده و اجرا کنید 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 به دنبال یک می‌گردد پایگاه داده موجود. متأسفانه بار اول که کانتینرهای ما اجرا می شوند، این شرط برآورده نمی شود. بنابراین، برای خودکارسازی کامل محیط توسعه، یک روش اولیه سازی مورد نیاز است.

روش اولیه سازی

ترتیب عملیات مورد نظر به شرح زیر است:

  1. کانتینر SQL Server را راه اندازی کنید.
  2. پایگاه داده و طرح مورد نظر را ایجاد کنید (اگر وجود نداشته باشد).
  3. کانتینر 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 آماده باشد. با تعداد زیادی اسکریپت و کمی همگام سازی بین کانتینرها، محیط توسعه شما برای پروژه های عالی شما آماده است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا