Ρύθμιση Docker


Τα διάφορα εργαλεία των διαδρομών μας γίνονται deploy ως images Docker.

Κάθε εργαλείο χρειάζεται ένα Dockerfile, το οποίο καθορίζει πώς χτίζεται το μηχάνημα. Θα πρέπει να βρίσκεται στον ριζικό κατάλογο του αποθετηρίου σου και να ονομάζεται Dockerfile.

Το Dockerfile θα πρέπει να δημιουργεί το ελάχιστο image που χρειάζεται το εργαλείο για να λειτουργεί σωστά και γρήγορα. Η σελίδα Βέλτιστες Πρακτικές έχει πολλές συμβουλές που θα σε βοηθήσουν να πετύχεις αυτόν τον στόχο.

Εκτέλεση

Χρονικά όρια

Ο test runner παίρνει 100% της CPU με 3GB μνήμης για ένα παράθυρο 20 δευτερολέπτων ανά λύση. Μετά από 20 δευτερόλεπτα, η διεργασία σταματά και αναφέρει υπέρβαση χρόνου με κωδικό σφάλματος 408.

Note

Συνιστούμε ανεπιφύλακτα να ακολουθήσεις το έγγραφο Βέλτιστες Πρακτικές για την Απόδοση για να μειώσεις την πιθανότητα υπερβάσεων χρόνου.

Stdout/stderr

Μια εκτέλεση εργαλείου μπορεί να παράγει το πολύ ένα megabyte από stdout και stderr. Αν παράγει περισσότερα, θα τερματιστεί με κωδικό σφάλματος 413.

Τα περιεχόμενα των stdout και stderr από κάθε εκτέλεση θα αποθηκεύονται σε αρχεία. Μπορείς να γράψεις ένα αρχείο results.out στον κατάλογο εξόδου, το οποίο περιέχει πληροφορίες για debugging.

Caution

Προς το παρόν, δεν είναι δυνατόν οι συντηρητές να δουν τα περιεχόμενα αυτών των αρχείων.

Αποτελέσματα

Το αρχείο αποτελεσμάτων δεν μπορεί να είναι μεγαλύτερο από 500 kilobyte (συμπεριλαμβανομένων τυχόν stack traces κ.λπ.). Αν το αρχείο είναι μεγαλύτερο, η εκτέλεση του εργαλείου θα τερματιστεί με κωδικό σφάλματος 460.

Διαμόρφωση

Κάθε λύση παίρνει 100% των πόρων του μηχανήματος για ένα παράθυρο είκοσι δευτερολέπτων. Μετά από 20 δευτερόλεπτα, η διεργασία σταματά και αναφέρεται ως υπέρβαση χρόνου.

Κάποια εργαλεία χρειάζονται (ελαφρές) αποκλίσεις από την προεπιλεγμένη διαμόρφωση. Αν συμβαίνει αυτό, ορίζονται στο αρχείο tools.json στο αποθετήριο Tooling Invoker.

Δίκτυο

Τα εργαλεία εκτελούνται χωρίς πρόσβαση στο διαδίκτυο. Υπάρχουν δύο διαφορετικές διαμορφώσεις που μπορείς να χρησιμοποιήσεις:

  1. none. Αυτή απενεργοποιεί τη συσκευή δικτύωσης μέσα στο container.
  2. 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 τοπικά

Μπορείς να δοκιμάσεις τις παραπάνω ρυθμίσεις με αυτή την εντολή:

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

Όλες οι αλλαγές στα Dockerfiles απαιτούν PR review από την ομάδα @exercism/maintainers-admin, ώστε να αποφευχθεί η εισαγωγή εκμεταλλεύσεων ασφαλείας.