ابزارهای مختلف مسیرهای ما بهصورت ایمیجهای Docker مستقر میشوند.
هر ابزار به یک Dockerfile نیاز دارد که مشخص میکند ماشین چگونه ساخته میشود.
این فایل باید در دایرکتوری ریشهی مخزن شما قرار بگیرد و اسمش Dockerfile باشد.
Dockerfile باید کمینهی ایمیج لازم را بسازد تا ابزار درست و سریع کار کند. ما در صفحهی بهترین شیوهها نکات زیادی داریم که به شما کمک میکند به این هدف برسید.
اجراکنندهی تست برای هر راهحل، در یک بازهی ۲۰ ثانیهای، ۱۰۰٪ پردازنده با ۳ گیگابایت حافظه در اختیار دارد. بعد از ۲۰ ثانیه، فرایند متوقف میشود و اتمام مهلت را با کد خطای ۴۰۸ گزارش میکند.
اکیداً توصیه میکنیم برای کاهش احتمال اتمام مهلت، سند بهترین شیوههای کارایی ما را دنبال کنید.
هر اجرای ابزار حداکثر میتواند یک مگابایت stdout و stderr تولید کند.
اگر بیشتر تولید کند، با کد خطای ۴۱۳ متوقف میشود.
محتوای stdout و stderr هر اجرا در فایلهایی ذخیره میشود.
میتوانید یک فایل results.out در دایرکتوری خروجی بنویسید که حاوی اطلاعات Debug است.
در حال حاضر، نگهدارندهها نمیتوانند محتوای این فایلها را ببینند.
فایل نتایج نمیتواند بزرگتر از ۵۰۰ کیلوبایت باشد (از جملهی هر stack trace و غیره). اگر فایل بزرگتر از این باشد، اجرای ابزار با کد خطای ۴۶۰ متوقف میشود.
هر راهحل در یک بازهی بیستثانیهای، ۱۰۰٪ منابع ماشین را در اختیار میگیرد. بعد از ۲۰ ثانیه، فرایند متوقف میشود و بهعنوان اتمام مهلت گزارش میشود.
بعضی ابزارها به انحرافهای (کوچکی) از پیکربندی پیشفرض نیاز دارند.
اگر اینطور باشد، اینها در فایل tools.json در مخزن Tooling Invoker پیکربندی میشوند.
ابزارها بدون دسترسی به اینترنت اجرا میشوند. دو پیکربندی متفاوت وجود دارد که میتوانید استفاده کنید:
none. این دستگاه شبکه داخل کانتینر را غیرفعال میکند.internal. این یک دستگاه شبکه داخل کانتینر اضافه میکند، اما شبکه به هیچ چیز بیرونی دسترسی ندارد.زبانهای مختلف با پیکربندیهای متفاوت بهتر یا بدتر عمل میکنند (مثلاً Ruby با none دو برابر سریعتر است. Elixir با internal 12x برابر سریعتر است.
میتوانید با استفاده از فلگ --network هنگام اجرای Docker خود، بهصورت محلی آزمایش کنید. --network none بهصورت پیشفرض پشتیبانی میشود.
برای استفاده از شبکهی داخلی، ابتدا docker network create --internal internal را اجرا کنید تا شبکه ساخته شود، سپس هنگام اجرای کانتینر از --network internal استفاده کنید.
زبانها میتوانند بیشینهی حافظهای را که برای اجرای کارهایشان لازم دارند تعیین کنند. تعیین این مقدار در کمترین حد ممکن یعنی میتوانیم کارهای بیشتری را سریعتر و بهصورت موازی اجرا کنیم. همچنین یعنی کسانی که بخواهند از حافظه سوءاستفاده کنند، موفق نمیشوند. زبانهای مختلف به بیشینهی مصرف حافظهی بهشدت متفاوتی نیاز دارند. بنچمارک کردن اجرای یک docker run برای تعیین بیشینهی حافظهای که مصرف میکند، توصیه و قدردانی میشود.
حافظه باید مشخص شود با استفاده از عدد بههمراه پسوند b، k، m، g، برای نشان دادن بایت، کیلوبایت، مگابایت یا گیگابایت.
میتوانید تنظیمات بالا را با این دستور آزمایش کنید:
docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/
همهی تغییرات در Dockerfileها نیاز به بازبینی PR از سوی تیم @exercism/maintainers-admin دارند، تا از ورود اکسپلویتهای امنیتی جلوگیری شود.