چگونه می‌توان Buildهای داکر چند مرحله‌ای در لاراول ایجاد کرد؟

‌Build‌های چند مرحله‌ای داکر (Docker) نسخه 17.05 برای کمک به بهینه سازی داکر فایل‌ها ایجاد شده‌ است. با لیداوب همراه باشید تا درباره آن‌ها اطلاعات بیشتری به دست آورید.


استفاده از Buildهای چند مرحله‌ای روشی ساده و آسان برای ایجاد یک Docker Build است که شرایط موردنیاز در سرور CI/build برای ایجاد یک تصویر داکر برای برنامه  لاراول شما را فراهم می‌کند. اگر شما با buildهای چند مرحله‌ای (multi-stage builds) آشنایی ندارید، هیچ جای نگرانی نیست. به طور خلاصه اینکه قبل از build‌های چند مرحله‌ای اگر شما می‌خواستید متعلقات composer و فرانت‌ اند را حین یک docker build برنامه خود نصب کنید، تصویر داکر شما باید شامل متعلقات ضروری مانند نصب Node.js و Composer PHP باشد. نگهداری داکر فایل‌ و تصویر ایجاد شده می‌تواند بسیار خسته کننده باشند.

روش دیگری که در محیط build می‌توان استفاده کرد نصب composer و متعلقات node بر روی سروری است که روی build اجرا می‌شود و سپس کپی کردن مواردی مانند پوشه vendor/ و فایل‌های build جاوا اسکریپت و CSS. یک نسخه ساده از متعلقات build در خارج از داکر و کپی کردن آن‌ها می‌تواند به صورت کد زیر باشد:

#!/usr/bin/env bash

set -e

tag=${1:-latest}

composer install \
    --ignore-platform-reqs \
  --no-interaction \
  --no-plugins \
  --no-scripts \
  --prefer-dist

yarn install && yarn production

docker build -t my-app:$tag .

کد بالا یک نسخه ساده شده برای نشان دادن نحوه آماده سازی PHP و متعلقات فرانت اند است و docker build پروژه را در تصویر کپی می‌کند. با استفاده از Build چند مرحله‌ای داکر، دیگر نیازی به نصب آن متعلقات یا انباشتن تمام آن در dockerfile خود و در نتیجه افزایش سایز عکس نهایی ندارید.

آشنایی بیشتر با فریم ورک لاراول:

لاراول چیست و چرا به محبوب‌ترین فریم ورک PHP تبدیل شده است؟

روش چند مرحله‌ای (Multi-Stage) داکر در لاراول

برای مثال، با استفاده از برنامه لاراول نسخه 5.6 می‌توانیم با ساخت متعلقات برای تصاویر آماده تولید در یک Dockerfile که حاوی چندین مرحله است شروع کنیم.

راه اندازی برنامه لاراول

یک پروژه نمونه را از خط فرمان به صورت زیر ایجاد می‌کنیم:

laravel new multi-stage-demo

cd multi-stage-demo

# Create the Dockerfile file
touch Dockerfile

# Generate the yarn lockfile
yarn install

git init
git add .
git commit -m"First commit"

سپس، یک فایل dockerignore. در ریشه برنامه لاراول خود ایجاد می‌کنیم:

.git/
vendor/
node_modules/
public/js/
public/css/
yarn-error.log

قرار نیست در اینجا به این موضوع بپردازیم که فایل .dockerignore چگونه کار می‌کند، بلکه نکته مهمی که باید آن را درک کنیم این است که این فایل از کپی کردن مسیرهای تعریف شده در طی یک docker build جلوگیری می‌کند. فایل ignore به این معنا است که پوشه vendor/ در حین یک عمل COPY یا ADD در dockerfile کپی نخواهد شد:

# copies the Laravel app, but skips the ignored files and paths
COPY . /var/www/html 

برای مثال، ignore کردن پوشه vendor/ یعنی اینکه ما یک build جدید از متعلقات composer از build خود به دست آورده‌ایم.

مطالعه مقالات کاربردی لاراول در لیداوب:

Dockerfile

داکر فایل برنامه ما در هر مرحله از ساخت برنامه به سه بخش تقسیم می‌شود:

۱. نصب متعلقات composer

۲. ساخت متعلقات فرانت اند

۳. کپی کردن کدهای برنامه خود از دو مرحله قبلی

مرحله اول

اولین مرحله مربوط به متعلقات composer می‌باشد، می‌توانید از official composer image برای نصب متعلقات برنامه خود در داکر فایل موجود در ریشه پروژه استفاده کنید:

#
# PHP Dependencies
#
FROM composer:1.7 as vendor

COPY database/ database/

COPY composer.json composer.json
COPY composer.lock composer.lock

RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist

به بخش as vendor دستورالعمل FROM دقت کنید. ما این نام را بعدا در زمان کپی کردن پوشه vendor/ در داکر فایل به عنوان رفرنس استفاده می‌کنیم. مرحله اول تعدادی از مسیرهای لازم که لاراول در classmap مربوط به composer.json autoload تنظیم می‌کند را کپی می‌کند. اگر یک build بازگردانی شود، می‌توانید نتیجه اجرای دستور composer installed را مشاهده کنید:

docker build -t ms-laravel-test -f docker/Dockerfile .

docker run --rm -it ms-laravel-test bash

# Inside the running container
bash-4.4# ls -la vendor/
...
bash-4.4# exit

در اینجا مرحله اول به پایان رسیده است. این مرحله از ساخت، تمام فایل‌های vendor/ لازم که بعدا کپی خواهیم کرد را نصب کرده است.

مرحله دوم

مرحله بعدی نصب متعلقات فرانت اند اپلیکیشن با استفاده از Yarn است. پس از مرحله اول، کد زیر را به داکرفایل اضافه کنید:

#
# Frontend
#
FROM node:8.11 as frontend

RUN mkdir -p /app/public

COPY package.json webpack.mix.js yarn.lock /app/
COPY resources/assets/ /app/resources/assets/

WORKDIR /app

RUN yarn install && yarn production

یک بار دیگر از یک تصویر رسمی استفاده می‌کنیم. این بار نسخه LTC فریم ورک Node که با yarn ادغام شده است. ما یک دایرکتوری /app/public ایجاد کرده و فایل های مورد نیاز را در مسیر /app کپی می کنیم تا Laravel Mix بداند که می‌تواند جاوا اسکریپت و CSS بسازد. در انتها، متعلقات پکیج را نصب کرده و دستور yarn production را اجرا می‌کنیم تا نصب متعلقات فرانت اند تمام شود.

در این مرحله، می‌توانیم دوباره تصویر را ایجاد کرده و متعلقات فرانت اند را بررسی کنیم:

docker build -t ms-laravel-test .
docker run --rm -it ms-laravel-test bash

# Inside the running container
[email protected]:/app# ls -la
[email protected]:/app# ls -la public/{js,css}
[email protected]:/app# exit

به راحتی مسیرهای فرانت اند را در حالی که در کانتینر هستید بررسی کنید و در نهایت از کانتینر در حال اجرا خارج شوید. حالا می‌توانیم مرحله آخر را با پوشه‌ای که ایجاد کرده‌ایم بسازیم.

مرحله سوم

مرحله سوم ایجاد داکر شامل کپی کردن فایل‌های برنامه از کد منبع و کپی کردن فایل‌های ساخته شده از مراحل قبلی فرآیند build است. برای ایجاد مرحله آخر، کد زیر را به dockerfile اضافه کنید:

#
# Application
#
FROM php:7.2-apache-stretch

COPY . /var/www/html
COPY --from=vendor /app/vendor/ /var/www/html/vendor/
COPY --from=frontend /app/public/js/ /var/www/html/public/js/
COPY --from=frontend /app/public/css/ /var/www/html/public/css/
COPY --from=frontend /app/mix-manifest.json /var/www/html/mix-manifest.json

ابتدا برنامه را در تصویر کپی می‌کنیم. فایل .dockerignore تضمین می‌کند که مسیرهای نادیده گرفته شده از دستگاه میزبان به درون تصویر کپی نشوند. به دستور COPY –from توجه کنید که به نام‌های مراحل قبل‌تر رفرنس می‌دهد، توجه کنید. ما فایل‌های ساختگی از مراحل قبل را به محل مناسب خود در تصویر نهایی کپی می‌کنیم.

اگر برای آخرین بار تصویر را بسازید، می‌توانید برنامه کامل را بدون پکیج‌های node یا کدهای composer مشاهده کنید:

docker build -t ms-laravel-test .
docker run --rm -it ms-laravel-test bash

# Inside the running container
[email protected]:/var/www/html# ls -la
...

تصویر نهایی ما یک تصویر PHP 7.2 با Apache است. البته، برای اجرای این برنامه نیاز به اصلاح فایل تنظیمات پیش‌فرض Vhost به /var/www/html/public که لاراول پیش‌بینی می‌کند، داریم. در اینجا، Dockerfile را به طور کامل مشاهده می‌کنید:

#
# PHP Dependencies
#
FROM composer:1.7 as vendor

COPY database/ database/

COPY composer.json composer.json
COPY composer.lock composer.lock

RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist

#
# Frontend
#
FROM node:8.11 as frontend

RUN mkdir -p /app/public

COPY package.json webpack.mix.js yarn.lock /app/
COPY resources/assets/ /app/resources/assets/

WORKDIR /app

RUN yarn install && yarn production

#
# Application
#
FROM php:7.2-apache-stretch

COPY . /var/www/html
COPY --from=vendor /app/vendor/ /var/www/html/vendor/
COPY --from=frontend /app/public/js/ /var/www/html/public/js/
COPY --from=frontend /app/public/css/ /var/www/html/public/css/
COPY --from=frontend /app/mix-manifest.json /var/www/html/mix-manifest.json

فرا بگیرید:

آموزش پایه لاراول ۵,۵

 در این مقاله آموزشی، شما با نحوه ساخت Build چند مرحله‌‌ای داکر در لاراول آشنا شدید. می‌توانید برای کسب اطلاعات بیشتر درباره ساخت داکر در یک برنامه لاراول می‌توانید به لینک Use multi-stage builds مراجعه کنید. مقالات تخصصی لیداوب در زمینه طراحی سایت و لاراول، شما را با تمام مسائلمربوط به این فریم ورک آشنا می‌کند.