हमारे अलग-अलग ट्रैक के सभी टूल Docker इमेज के रूप में डिप्लॉय किए जाते हैं।
हर टूल के लिए एक Dockerfile ज़रूरी है। यह फाइल बताती है कि मशीन कैसे बनाई जाती है।
यह आपके रिपॉज़िटरी की रूट डायरेक्टरी में होनी चाहिए और उसका नाम Dockerfile होना चाहिए।
Dockerfile में वह न्यूनतम इमेज बननी चाहिए जो टूल के सही और तेज़ तरीके से काम करने के लिए ज़रूरी हो। हमारे बेस्ट प्रैक्टिसेज़ पेज पर बहुत से सुझाव हैं, जो आपको यह लक्ष्य हासिल करने में मदद करेंगे।
हर सॉल्यूशन के लिए टेस्ट रनर को 20 सेकंड की अवधि के लिए 100% CPU और 3GB मेमोरी मिलती है। 20 सेकंड बाद प्रोसेस रोक दिया जाता है और वह 408 एरर कोड के साथ टाइमआउट की सूचना देता है।
टाइमआउट की संभावना कम करने के लिए हम परफॉर्मेंस बेस्ट प्रैक्टिसेज़ दस्तावेज़ का पालन करने की पूरी सलाह देते हैं।
टूल चलाने पर अधिकतम एक मेगाबाइट तक stdout और stderr पैदा हो सकता है। अगर इससे ज़्यादा पैदा होता है, तो इसे 413 एरर कोड के साथ बंद कर दिया जाता है।
हर बार चलाने पर stdout और stderr की सामग्री फाइलों में संग्रहीत की जाती है।
आप आउटपुट डायरेक्टरी में एक results.out फाइल लिख सकते हैं, जिसमें डीबगिंग की जानकारी होती है।
फिलहाल मेंटेनर इन फाइलों की सामग्री नहीं देख सकते।
रिज़ल्ट फाइल 500 किलोबाइट से बड़ी नहीं होनी चाहिए (स्टैक ट्रेस वगैरह सहित)। अगर फाइल इससे बड़ी है, तो टूल का चलना 460 एरर कोड के साथ रोक दिया जाएगा।
हर सॉल्यूशन को बीस सेकंड की अवधि के लिए 100% मशीन संसाधन मिलते हैं। 20 सेकंड बाद प्रोसेस रोक दिया जाता है और टाइमआउट बताया जाता है।
कुछ टूल के लिए डिफॉल्ट कॉन्फिगरेशन से (थोड़ी) अलग सेटिंग चाहिए होती है।
ऐसी स्थिति में इन्हें Tooling Invoker रिपॉज़िटरी की tools.json फाइल में कॉन्फिगर किया जाता है।
टूल इंटरनेट की पहुँच के बिना चलते हैं। आप दो अलग-अलग कॉन्फिगरेशन इस्तेमाल कर सकते हैं:
none। यह कंटेनर के अंदर का नेटवर्किंग डिवाइस बंद कर देता है।internal। यह कंटेनर के अंदर एक नेटवर्किंग डिवाइस जोड़ता है, लेकिन इस नेटवर्क की किसी भी बाहरी चीज़ तक पहुँच नहीं होती।अलग-अलग कॉन्फिगरेशन के साथ भाषाएँ अलग-अलग तरह से बेहतर या खराब चलती हैं (जैसे none के साथ Ruby 2x तेज़ चलती है। internal के साथ Elixir 12x तेज़ चलती है।
आप अपना docker चलाते समय --network फ्लैग इस्तेमाल करके इसे अपने सिस्टम पर ही आज़मा सकते हैं। --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 में किए गए हर बदलाव के लिए @exercism/maintainers-admin टीम की PR समीक्षा ज़रूरी है।