اجرای دستور‌های artisan توسط داکر

اجرای دستور‌های artisan توسط داکر

در بخش قبلی، با کمک کانتینر های داکر توانستیم دستور های npm را اجرا کنیم. همچنین با حالت های shell و exec در مشخص کردن entrypoint آشنا شدیم. در این بخش می خواهیم دستور های artisan لاراول را توسط داکر اجرا کنیم. 

اجرای دستور های artisan با npm کمی تفاوت دارد. npm برنامه ای است که آن را به شکل مستقل اجرا می کنیم اما artisan برنامه ای نیست که خارج از فریم ورک لاراول قابل اجرا باشد. بلکه اسکریپتی داخل برنامه ما است که به کمک PHP اجرا می شود. البته از آن جایی که یک image خوب برای PHP نوشته ایم، ایجاد سرویسی برای اجرای artisan کار سختی نیست.

در فایل docker compose مان سرویس جدیدی با نام artisan اضافه می کنیم. مانند سرویس PHP این سرویس هم از یک dockerfile ساخته می شود.

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html

برای سرویس artisan از همان image ای استفاده کردیم که برای PHP نوشته بودیم. اینگونه همان نسخه PHP و همان تنظیماتی که برنامه ما را اجرا می کند، برای اجرای artisan هم استفاده خواهد شد. بخش volume این سرویس هم مشابه سرویس PHP است.

نیاز است برای این سرویس برچسب working_dir را هم تعریف کنیم تا مشخص کنیم همیشه دستور های این کانتینر در مسیر پروژه اجرا شوند.

working_dir: /var/www/html

از آن جایی که ممکن است دستور artisan ای اجرا کنیم که با دیتابیس تعامل دارد، سرویس artisan به فعال بودن کانتینر mysql وابسته است. پس برچسب depends_on را هم برای این سرویس می نویسیم.

    depends_on:
      - mysql

در پایان، نوبت به تعریف entrypoint این کانتینر می رسد. مانند npm، باید دستوری که هنگام اجرای این سرویس استفاده می شود را مشخص کنیم.

    entrypoint: ["php", "/var/www/html/artisan"]

در نهایت فایل docker compose ما به این شکل می شود:

version: '3.8'

services:
  nginx:
    build:
      context: .
      dockerfile: nginx.dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
      - php
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    environment:
     MYSQL_DATABASE: sokanacademy
      MYSQL_USER: sokanacademy
     MYSQL_PASSWORD: secret
     MYSQL_ROOT_PASSWORD: secret
    volumes:
      - ./mysql:/var/lib/mysql
  php:
    build:
      context: .
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html
  composer:
    image: composer:2
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
  npm:
    image: node:current-alpine
    volumes:
      - ./src:/var/www/html
    entrypoint: ["npm"]
    working_dir: /var/www/html
  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - mysql
    entrypoint: ["php", "/var/www/html/artisan"]

اکنون می توانیم از سرویس artisan استفاده کنیم. برای نمونه دستور migrate را اجرا می کنیم تا جدول‌های دیتابیس ایجاد شوند.

docker compose run --rm artisan migrate

اجرای این دستور با خطای connection refused مواجه شد! دلیل بروز خطا این است که ما پس از نصب لاراول، فایل env. که اطلاعات وصل شدن به دیتابیس در آن قرار دارد را به‌روز‌‌رسانی نکردیم.

پیش از این در فایل docker compose اطلاعات دیتابیس را انتخاب کرده بودیم. اکنون باید آن مقدار ها را در فایل env. استفاده کنیم.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sokanacademy
DB_USERNAME=sokanacademy
DB_PASSWORD=secret

یک تغییر دیگر هم باید انجام دهیم. مقدار host برای دیتابیس دیگر localhost نیست! سرویس های PHP و artisan ما نسبت به سرویس MySQL ایزوله هستند. قرار دادن localhost برای مقدار host به این معنی است که داخل کانتینر PHP و artisan دیتابیس MySQL در حال اجرا است. به جای localhost باید آدرس آی پی (IP) کانتینر MySQL را قرار دهیم. مانند کاری که هنگام پیکربندی nginx انجام دادیم اینجا هم می توانیم از نام سرویس به جای آدرس آی پی آن استفاده کنیم. بنابراین مقدار های مربوط به دیتابیس در فایل env. ما به شکل زیر باید باشد:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sokanacademy
DB_USERNAME=sokanacademy
DB_PASSWORD=secret

پس از ذخیره تغییرات فایل env. می توانیم دستور اجرای مایگریشن ها را اجرا کنیم.

مانند composer و npm می توانیم هر دستور artisan ای را بدون داشتن PHP و MySQL در محیط local مان اجرا کنیم. برای نمونه می توانیم یک مدل ایجاد کنیم.

از آن جایی که از volume ها استفاده می کنیم، فایل های ایجاد شده توسط این دستور در سیستم ما قابل استفاده اند.

همچنین می توانیم از tinker هم استفاده کنیم. 

برای نمونه در تصویر بالا توسط tinker یک کاربر ایجاد کردیم.

اکنون که ابزار مورد نیاز برای اجرا و توسعه یک برنامه با فریم ورک لاراول را در اختیار داریم می توانیم به مباحث پیشرفته تری مانند orchestration و load balancing بپردازیم. همچنین اگر تصمیم دارید در محیط production از داکر استفاده کنید، پیشنهاد می کنم بخش توضیحات image هایی که استفاده می کنید را با دقت مطالعه کنید. امیدوارم این فصل از دوره داکر برای شما مفید بوده باشد. اگر درمورد مباحث این فصل سوالی داشتید می توانید در بخش نظرات آن را با کاربران دیگر به اشتراک بگذارید.

دوره در حال تکمیل است ... rocket