نصب ionCube Loader در داکر و Laravel Sail
برای نصب ionCube Loader در داکر باید لودر را در مرحله ساخت ایمیج اضافه کنید، نه بعد از اجرای کانتینر. دلیلش ساده است: کانتینرها بیحالتاند و هر تغییری که داخل کانتینر در حال اجرا بدهید، با ساخت مجدد از بین میرود. راه درست، افزودن چند خط به Dockerfile است تا لودر بخشی از خود ایمیج شود.
این مقاله در یک نگاه
- لودر باید در مرحله build ایمیج نصب شود، نه در کانتینر در حال اجرا.
- نسخه فایل so باید با نسخه PHP ایمیج پایه هماهنگ باشد.
- فایل ini لودر در مسیر conf.d قرار میگیرد.
- برای Laravel Sail باید Dockerfile را publish و ویرایش کنید.
- بعد از تغییر Dockerfile حتما ایمیج را دوباره build کنید.
چرا در Dockerfile؟
اگر وارد یک کانتینر در حال اجرا شوید و لودر را نصب کنید، تا زمانی که آن کانتینر زنده است کار میکند. اما به محض اینکه کانتینر بازسازی شود یا روی محیط دیگری اجرا شود، همه چیز از بین میرود.
فلسفه داکر این است که محیط باید در کد تعریف شود. پس لودر هم باید بخشی از تعریف ایمیج باشد تا هر بار که ایمیج ساخته میشود، به صورت خودکار حضور داشته باشد.
افزودن به Dockerfile
مراحل مشابه نصب روی سرور لینوکس است، فقط داخل Dockerfile نوشته میشود. ابتدا باید بدانید ایمیج پایه شما چه نسخهای از PHP دارد.
نکات مهم این قطعه: نام فایل .so باید دقیقا با نسخه PHP ایمیج بخواند، فایل ini با پیشوند 00- نامگذاری شده تا پیش از OPcache بارگذاری شود، و فایلهای موقت در همان لایه حذف میشوند تا حجم ایمیج بیدلیل بالا نرود.
Laravel Sail
Laravel Sail به صورت پیشفرض از ایمیج آماده استفاده میکند و Dockerfile در دسترس شما نیست. برای تغییر آن باید ابتدا فایلهای داکر را منتشر کنید.
- انتشار فایلهای داکر دستور
php artisan sail:publishرا اجرا کنید تا پوشه docker ساخته شود. - ویرایش Dockerfile قطعه نصب لودر را به Dockerfile نسخه PHP موردنظر اضافه کنید.
- ساخت مجدد با
sail build --no-cacheایمیج را از نو بسازید. - راهاندازی با
sail up -dکانتینرها را بالا بیاورید. - بررسی با
sail php -vوجود لودر را تایید کنید.
بررسی نصب
| روش | دستور |
|---|---|
| داخل کانتینر | docker compose exec app php -v |
| در Sail | sail php -v |
| فهرست ماژولها | php -m | grep -i ioncube |
در خروجی باید خط «with the ionCube PHP Loader» را ببینید. اگر نبود، معمولا یعنی نسخه فایل .so با نسخه PHP ایمیج نمیخواند.
نکات محیط کانتینری
هماهنگی نسخه اگر ایمیج پایه را از php:8.2-fpm به php:8.3-fpm تغییر دادید، فایل .so را هم باید عوض کنید.
حجم ایمیج فایلهای موقت را در همان دستور RUN حذف کنید تا در لایههای ایمیج باقی نمانند.
محیط تولید اگر ایمیج تولیدی جداگانه دارید، مطمئن شوید لودر در آن هم نصب میشود؛ نه فقط در ایمیج توسعه.
برای درک نقش لودر این مقاله و برای نصب روی سرور معمولی این راهنما را ببینید. بستههای رسمی در سایت ionCube موجود است.
سوالات متداول
چرا نصب داخل کانتینر در حال اجرا کافی نیست؟
چون کانتینرها بیحالتاند و با بازسازی، تغییرات از بین میرود. لودر باید بخشی از تعریف ایمیج در Dockerfile باشد.
در Laravel Sail چطور Dockerfile را ویرایش کنم؟
ابتدا با php artisan sail:publish فایلهای داکر را منتشر کنید، سپس Dockerfile نسخه PHP موردنظر را ویرایش و ایمیج را دوباره build کنید.
بعد از تغییر Dockerfile چه کنم؟
حتما ایمیج را با build --no-cache دوباره بسازید. بدون این کار، کانتینر از ایمیج قدیمی استفاده میکند.
اگر نسخه PHP ایمیج را عوض کنم چه؟
باید فایل so متناسب با نسخه جدید را در Dockerfile جایگزین کنید، وگرنه لودر بارگذاری نمیشود.
چطور حجم ایمیج را کم نگه دارم؟
فایلهای دانلودی و موقت را در همان دستور RUN حذف کنید تا در لایههای ایمیج باقی نمانند.
مطالب مرتبط: نصب روی سرور لینوکس · ionCube Loader چیست؟ · رفع خطای لودر
PHP