Configurazione di Docker


I nostri vari strumenti per i track vengono distribuiti come immagini Docker.

Ogni strumento richiede un Dockerfile, che specifica come viene costruita la macchina. Dovrebbe trovarsi nella directory principale del tuo repository e dovrebbe chiamarsi Dockerfile.

Il Dockerfile dovrebbe creare l'immagine minima necessaria perché lo strumento funzioni correttamente e rapidamente. La nostra pagina delle buone pratiche contiene molti consigli che ti aiuteranno a raggiungere questo obiettivo.

Esecuzione

Timeout

Il test runner riceve il 100% della CPU e 3 GB di memoria per una finestra di 20 secondi per ogni soluzione. Dopo 20 secondi, il processo viene interrotto e segnala un timeout con un codice di errore 408.

Note

Ti consigliamo vivamente di seguire il nostro documento sulle buone pratiche per le prestazioni per ridurre il rischio di timeout.

Stdout/stderr

L'esecuzione di uno strumento può produrre al massimo un megabyte tra stdout e stderr. Se ne produce di più, verrà terminata con un codice di errore 413.

Il contenuto di stdout e stderr di ogni esecuzione verrà salvato in alcuni file. Puoi scrivere un file results.out nella directory di output, che contiene informazioni di debug.

Caution

Al momento, i maintainer non possono visualizzare il contenuto di questi file.

Risultati

Il file dei risultati non può superare i 500 kilobyte (compresi eventuali stack trace e così via). Se il file è più grande di così, l'esecuzione dello strumento verrà terminata con un codice di errore 460.

Configurazione

Ogni soluzione riceve il 100% delle risorse della macchina per una finestra di venti secondi. Dopo 20 secondi, il processo viene interrotto e segnalato come timeout.

Alcuni strumenti richiedono (lievi) deviazioni dalla configurazione predefinita. In tal caso, vengono configurate nel file tools.json nel repository Tooling Invoker.

Rete

Gli strumenti vengono eseguiti senza accesso a internet. Ci sono due configurazioni diverse che puoi usare:

  1. none. Disattiva il dispositivo di rete all'interno del container.
  2. internal. Aggiunge un dispositivo di rete all'interno del container, ma la rete non ha accesso a nulla di esterno.

Linguaggi diversi si comportano meglio o peggio con configurazioni diverse (ad esempio Ruby è 2 volte più veloce con none. Elixir è 12x più veloce con internal).

Puoi fare qualche prova in locale usando il flag --network quando esegui docker. --network none è supportato per impostazione predefinita. Per usare la rete interna, esegui prima docker network create --internal internal per creare la rete, poi usa --network internal quando esegui il container.

Memoria

I linguaggi possono impostare la memoria massima di cui hanno bisogno per eseguire i loro job. Impostarla al valore più basso possibile significa che possiamo eseguire più job in parallelo e più rapidamente. Significa anche che chi cerca di abusare della memoria non avrà successo. Linguaggi diversi richiedono quantità di memoria massima molto diverse. Fare benchmark sull'esecuzione di un docker run per stabilire la memoria massima che usa è consigliato e apprezzato.

La memoria dovrebbe essere specificata usando il numero con il suffisso b, k, m, g, per indicare byte, kilobyte, megabyte o gigabyte.

Eseguire Docker in locale

Puoi provare le impostazioni qui sopra con questo comando:

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/

Modificare un Dockerfile

Tutte le modifiche ai Dockerfile richiedono la revisione di una PR da parte del team @exercism/maintainers-admin, per evitare l'introduzione di exploit di sicurezza.