Τα διάφορα εργαλεία των διαδρομών μας γίνονται deploy ως images Docker.
Κάθε εργαλείο χρειάζεται ένα Dockerfile, το οποίο καθορίζει πώς χτίζεται το μηχάνημα.
Θα πρέπει να βρίσκεται στον ριζικό κατάλογο του αποθετηρίου σου και να ονομάζεται Dockerfile.
Το Dockerfile θα πρέπει να δημιουργεί το ελάχιστο image που χρειάζεται το εργαλείο για να λειτουργεί σωστά και γρήγορα. Η σελίδα Βέλτιστες Πρακτικές έχει πολλές συμβουλές που θα σε βοηθήσουν να πετύχεις αυτόν τον στόχο.
Ο test runner παίρνει 100% της CPU με 3GB μνήμης για ένα παράθυρο 20 δευτερολέπτων ανά λύση. Μετά από 20 δευτερόλεπτα, η διεργασία σταματά και αναφέρει υπέρβαση χρόνου με κωδικό σφάλματος 408.
Συνιστούμε ανεπιφύλακτα να ακολουθήσεις το έγγραφο Βέλτιστες Πρακτικές για την Απόδοση για να μειώσεις την πιθανότητα υπερβάσεων χρόνου.
Μια εκτέλεση εργαλείου μπορεί να παράγει το πολύ ένα megabyte από stdout και stderr. Αν παράγει περισσότερα, θα τερματιστεί με κωδικό σφάλματος 413.
Τα περιεχόμενα των stdout και stderr από κάθε εκτέλεση θα αποθηκεύονται σε αρχεία.
Μπορείς να γράψεις ένα αρχείο results.out στον κατάλογο εξόδου, το οποίο περιέχει πληροφορίες για debugging.
Προς το παρόν, δεν είναι δυνατόν οι συντηρητές να δουν τα περιεχόμενα αυτών των αρχείων.
Το αρχείο αποτελεσμάτων δεν μπορεί να είναι μεγαλύτερο από 500 kilobyte (συμπεριλαμβανομένων τυχόν stack traces κ.λπ.). Αν το αρχείο είναι μεγαλύτερο, η εκτέλεση του εργαλείου θα τερματιστεί με κωδικό σφάλματος 460.
Κάθε λύση παίρνει 100% των πόρων του μηχανήματος για ένα παράθυρο είκοσι δευτερολέπτων. Μετά από 20 δευτερόλεπτα, η διεργασία σταματά και αναφέρεται ως υπέρβαση χρόνου.
Κάποια εργαλεία χρειάζονται (ελαφρές) αποκλίσεις από την προεπιλεγμένη διαμόρφωση.
Αν συμβαίνει αυτό, ορίζονται στο αρχείο tools.json στο αποθετήριο Tooling Invoker.
Τα εργαλεία εκτελούνται χωρίς πρόσβαση στο διαδίκτυο. Υπάρχουν δύο διαφορετικές διαμορφώσεις που μπορείς να χρησιμοποιήσεις:
none. Αυτή απενεργοποιεί τη συσκευή δικτύωσης μέσα στο container.internal. Αυτή προσθέτει μια συσκευή δικτύωσης μέσα στο container, αλλά το δίκτυο δεν έχει πρόσβαση σε τίποτα εξωτερικό.Διαφορετικές γλώσσες αποδίδουν καλύτερα ή χειρότερα με διαφορετικές διαμορφώσεις (π.χ. η Ruby είναι 2x πιο γρήγορη με το none. Η Elixir είναι 12x πιο γρήγορη με το internal).
Μπορείς να πειραματιστείς τοπικά χρησιμοποιώντας το flag --network όταν τρέχεις το docker σου. Το --network none υποστηρίζεται από προεπιλογή.
Για να χρησιμοποιήσεις το εσωτερικό δίκτυο, τρέξε πρώτα docker network create --internal internal για να δημιουργήσεις το δίκτυο και μετά χρησιμοποίησε το --network internal όταν τρέχεις το container.
Οι γλώσσες μπορούν να ορίσουν τη μέγιστη μνήμη που χρειάζονται για να εκτελέσουν τις εργασίες τους. Ο ορισμός της όσο το δυνατόν χαμηλότερα σημαίνει ότι μπορούμε να εκτελούμε περισσότερες εργασίες πιο γρήγορα, παράλληλα. Σημαίνει επίσης ότι όσοι επιχειρούν να καταχραστούν τη μνήμη δεν θα τα καταφέρνουν. Διαφορετικές γλώσσες χρειάζονται εντελώς διαφορετική μέγιστη χρήση μνήμης. Συνιστάται και εκτιμάται ιδιαίτερα η μέτρηση της εκτέλεσης ενός docker run, ώστε να προσδιοριστεί η μέγιστη μνήμη που χρησιμοποιεί.
Η μνήμη πρέπει να ορίζεται χρησιμοποιώντας τον αριθμό με κατάληξη b, k, m, g, για να δηλώσεις bytes, kilobytes, megabytes ή gigabytes.
Μπορείς να δοκιμάσεις τις παραπάνω ρυθμίσεις με αυτή την εντολή:
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/
Όλες οι αλλαγές στα Dockerfiles απαιτούν PR review από την ομάδα @exercism/maintainers-admin, ώστε να αποφευχθεί η εισαγωγή εκμεταλλεύσεων ασφαλείας.