راه‌اندازی Docker


ابزارهای مختلف مسیرهای ما به‌صورت ایمیج‌های Docker مستقر می‌شوند.

هر ابزار به یک Dockerfile نیاز دارد که مشخص می‌کند ماشین چگونه ساخته می‌شود. این فایل باید در دایرکتوری ریشه‌ی مخزن شما قرار بگیرد و اسمش Dockerfile باشد.

Dockerfile باید کمینه‌ی ایمیج لازم را بسازد تا ابزار درست و سریع کار کند. ما در صفحه‌ی بهترین شیوه‌ها نکات زیادی داریم که به شما کمک می‌کند به این هدف برسید.

اجرا

اتمام مهلت

اجراکننده‌ی تست برای هر راه‌حل، در یک بازه‌ی ۲۰ ثانیه‌ای، ۱۰۰٪ پردازنده با ۳ گیگابایت حافظه در اختیار دارد. بعد از ۲۰ ثانیه، فرایند متوقف می‌شود و اتمام مهلت را با کد خطای ۴۰۸ گزارش می‌کند.

Note

اکیداً توصیه می‌کنیم برای کاهش احتمال اتمام مهلت، سند بهترین شیوه‌های کارایی ما را دنبال کنید.

خروجی استاندارد/خطای استاندارد

هر اجرای ابزار حداکثر می‌تواند یک مگابایت stdout و stderr تولید کند. اگر بیشتر تولید کند، با کد خطای ۴۱۳ متوقف می‌شود.

محتوای stdout و stderr هر اجرا در فایل‌هایی ذخیره می‌شود. می‌توانید یک فایل results.out در دایرکتوری خروجی بنویسید که حاوی اطلاعات Debug است.

Caution

در حال حاضر، نگه‌دارنده‌ها نمی‌توانند محتوای این فایل‌ها را ببینند.

نتایج

فایل نتایج نمی‌تواند بزرگ‌تر از ۵۰۰ کیلوبایت باشد (از جمله‌ی هر stack trace و غیره). اگر فایل بزرگ‌تر از این باشد، اجرای ابزار با کد خطای ۴۶۰ متوقف می‌شود.

پیکربندی

هر راه‌حل در یک بازه‌ی بیست‌ثانیه‌ای، ۱۰۰٪ منابع ماشین را در اختیار می‌گیرد. بعد از ۲۰ ثانیه، فرایند متوقف می‌شود و به‌عنوان اتمام مهلت گزارش می‌شود.

بعضی ابزارها به انحراف‌های (کوچکی) از پیکربندی پیش‌فرض نیاز دارند. اگر این‌طور باشد، این‌ها در فایل tools.json در مخزن Tooling Invoker پیکربندی می‌شوند.

شبکه

ابزارها بدون دسترسی به اینترنت اجرا می‌شوند. دو پیکربندی متفاوت وجود دارد که می‌توانید استفاده کنید:

  1. none. این دستگاه شبکه داخل کانتینر را غیرفعال می‌کند.
  2. internal. این یک دستگاه شبکه داخل کانتینر اضافه می‌کند، اما شبکه به هیچ چیز بیرونی دسترسی ندارد.

زبان‌های مختلف با پیکربندی‌های متفاوت بهتر یا بدتر عمل می‌کنند (مثلاً Ruby با none دو برابر سریع‌تر است. Elixir با internal ‏12x برابر سریع‌تر است.

می‌توانید با استفاده از فلگ --network هنگام اجرای Docker خود، به‌صورت محلی آزمایش کنید. --network none به‌صورت پیش‌فرض پشتیبانی می‌شود. برای استفاده از شبکه‌ی داخلی، ابتدا docker network create --internal internal را اجرا کنید تا شبکه ساخته شود، سپس هنگام اجرای کانتینر از --network internal استفاده کنید.

حافظه

زبان‌ها می‌توانند بیشینه‌ی حافظه‌ای را که برای اجرای کارهایشان لازم دارند تعیین کنند. تعیین این مقدار در کمترین حد ممکن یعنی می‌توانیم کارهای بیشتری را سریع‌تر و به‌صورت موازی اجرا کنیم. همچنین یعنی کسانی که بخواهند از حافظه سوءاستفاده کنند، موفق نمی‌شوند. زبان‌های مختلف به بیشینه‌ی مصرف حافظه‌ی به‌شدت متفاوتی نیاز دارند. بنچمارک کردن اجرای یک docker run برای تعیین بیشینه‌ی حافظه‌ای که مصرف می‌کند، توصیه و قدردانی می‌شود.

حافظه باید مشخص شود با استفاده از عدد به‌همراه پسوند b، k، m، g، برای نشان دادن بایت، کیلوبایت، مگابایت یا گیگابایت.

اجرای Docker به‌صورت محلی

می‌توانید تنظیمات بالا را با این دستور آزمایش کنید:

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

همه‌ی تغییرات در Dockerfileها نیاز به بازبینی PR از سوی تیم @exercism/maintainers-admin دارند، تا از ورود اکسپلویت‌های امنیتی جلوگیری شود.