Docker সেটআপ


আমাদের বিভিন্ন ট্র্যাকের টুলিং Docker ইমেজ হিসেবে ডিপ্লয় করা হয়।

প্রতিটি টুলিংয়ের জন্য একটি Dockerfile প্রয়োজন, যা নির্দিষ্ট করে যে মেশিনটি কীভাবে তৈরি হয়। এটি আপনার রিপোজিটরির রুট ডিরেক্টরিতে থাকা উচিত এবং এর নাম Dockerfile হওয়া উচিত।

টুলিং যাতে সঠিকভাবে ও দ্রুত কাজ করতে পারে, তার জন্য প্রয়োজনীয় ন্যূনতম ইমেজ তৈরি করা উচিত Dockerfile-এর। এই লক্ষ্য অর্জনে আপনাকে সহায়তা করার জন্য আমাদের বেস্ট প্র্যাকটিসেস পেজে অনেক টিপস আছে।

এক্সিকিউশন

টাইমআউট

প্রতি সলিউশনের জন্য ২০ সেকেন্ডের একটি উইন্ডোতে টেস্ট রানার ১০০% CPU এবং ৩GB মেমরি পায়। ২০ সেকেন্ড পর প্রক্রিয়াটি থামিয়ে দেওয়া হয় এবং 408 এরর কোডসহ একটি টাইমআউট জানানো হয়।

Note

টাইমআউটের সম্ভাবনা কমাতে আমরা আমাদের পারফরম্যান্স বেস্ট প্র্যাকটিসেস ডকুমেন্ট অনুসরণ করার জোরালো সুপারিশ করি।

Stdout/stderr

একটি টুলিং রান সর্বোচ্চ এক মেগাবাইট stdout ও stderr তৈরি করতে পারে। এর চেয়ে বেশি তৈরি করলে 413 এরর কোড দিয়ে এটি বন্ধ করে দেওয়া হবে।

প্রতিটি রানের stdout ও stderr-এর বিষয়বস্তু ফাইলে সংরক্ষণ করা হবে। আপনি আউটপুট ডিরেক্টরিতে একটি results.out ফাইল লিখতে পারেন, যাতে ডিবাগিং তথ্য থাকে।

Caution

এই মুহূর্তে মেইনটেইনারদের পক্ষে এই ফাইলগুলোর বিষয়বস্তু দেখা সম্ভব নয়।

ফলাফল

ফলাফল ফাইলটি ৫০০ কিলোবাইটের বেশি হতে পারবে না (যেকোনো স্ট্যাক ট্রেস ইত্যাদিসহ)। ফাইলটি এর চেয়ে বড় হলে 460 এরর কোড দিয়ে টুলিং রানটি বন্ধ করে দেওয়া হবে।

কনফিগারেশন

প্রতিটি সলিউশন বিশ সেকেন্ডের একটি উইন্ডোর জন্য ১০০% মেশিন রিসোর্স পায়। ২০ সেকেন্ড পর প্রক্রিয়াটি থামিয়ে দেওয়া হয় এবং টাইমআউট হিসেবে জানানো হয়।

কিছু টুলের ডিফল্ট কনফিগারেশন থেকে (সামান্য) ভিন্নতা প্রয়োজন হয়। সেক্ষেত্রে এগুলো Tooling Invoker রিপোজিটরির tools.json ফাইলে কনফিগার করা হয়।

নেটওয়ার্ক

টুলগুলো ইন্টারনেট অ্যাক্সেস ছাড়াই রান করে। আপনি দুটি ভিন্ন কনফিগারেশন ব্যবহার করতে পারেন:

  1. none। এটি কন্টেইনারের ভেতরের নেটওয়ার্কিং ডিভাইস নিষ্ক্রিয় করে।
  2. internal। এটি কন্টেইনারের ভেতরে একটি নেটওয়ার্কিং ডিভাইস যোগ করে, কিন্তু ওই নেটওয়ার্কের বাইরের কোনো কিছুতে অ্যাক্সেস থাকে না।

ভিন্ন কনফিগারেশনে ভিন্ন ভাষার পারফরম্যান্স ভালো/খারাপ হয় (যেমন রুবি none দিয়ে 2x দ্রুত। এলিক্সির internal দিয়ে 12x দ্রুত)।

আপনার docker রান করার সময় --network ফ্ল্যাগ ব্যবহার করে স্থানীয়ভাবে পরীক্ষা করতে পারেন। --network none ডিফল্টভাবেই সাপোর্ট করা হয়। ইন্টারনাল নেটওয়ার্ক ব্যবহার করতে, প্রথমে নেটওয়ার্কটি তৈরি করার জন্য docker network create --internal internal রান করুন, তারপর কন্টেইনার রান করার সময় --network internal ব্যবহার করুন।

মেমরি

ভাষাগুলো তাদের জব রান করার জন্য প্রয়োজনীয় সর্বোচ্চ মেমরি নির্ধারণ করতে পারে। এটি যতটা সম্ভব কম নির্ধারণ করা মানে হলো আমরা সমান্তরালে আরও বেশি জব আরও দ্রুত রান করতে পারি। এর মানে আরও হলো, যারা মেমরি অপব্যবহারের চেষ্টা করবে তারা সফল হতে পারবে না। ভিন্ন ভাষার ক্ষেত্রে সর্বোচ্চ মেমরি ব্যবহারের প্রয়োজনীয়তা আমূল আলাদা হয়। একটি docker রানের এক্সিকিউশন বেঞ্চমার্ক করে তার ব্যবহৃত সর্বোচ্চ মেমরি নির্ণয় করা বাঞ্ছনীয় এবং প্রশংসনীয়।

মেমরি নির্ধারণ করা উচিত সংখ্যার সাথে 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-এ সব পরিবর্তনের জন্য @exercism/maintainers-admin টিমের একটি PR রিভিউ দরকার।