Configuration de Docker


Nos différents outils de parcours sont déployés sous forme d'images Docker.

Chaque outil nécessite un Dockerfile, qui spécifie comment la machine est construite. Il doit se trouver à la racine de ton dépôt et s'appeler Dockerfile.

Le Dockerfile doit créer l'image minimale nécessaire pour que les outils fonctionnent correctement et rapidement. Notre page sur les bonnes pratiques regorge d'astuces pour t'aider à atteindre cet objectif.

Exécution

Délais d'expiration

L'exécuteur de tests dispose de 100 % d'un CPU et de 3 Go de mémoire pendant une fenêtre de 20 secondes par solution. Au bout de 20 secondes, le processus est arrêté et signale un dépassement de délai avec un code d'erreur 408.

Note

On te recommande vivement de suivre notre document sur les bonnes pratiques de performance pour réduire le risque de dépassements de délai.

Stdout/stderr

Une exécution des outils peut produire au maximum un mégaoctet sur stdout et stderr. Si elle en produit davantage, elle sera arrêtée avec un code d'erreur 413.

Le contenu de stdout et de stderr de chaque exécution est stocké dans des fichiers. Tu peux écrire un fichier results.out dans le répertoire de sortie, qui contient des informations de débogage.

Caution

Pour l'instant, les mainteneurs ne peuvent pas consulter le contenu de ces fichiers.

Résultats

Le fichier de résultats ne doit pas dépasser 500 kilooctets (y compris les éventuelles traces de pile, etc.). Si le fichier est plus volumineux, l'exécution des outils sera arrêtée avec un code d'erreur 460.

Configuration

Chaque solution dispose de 100 % des ressources de la machine pendant une fenêtre de vingt secondes. Au bout de 20 secondes, le processus est arrêté et signalé comme un dépassement de délai.

Certains outils nécessitent des écarts (légers) par rapport à la configuration par défaut. Le cas échéant, ils se configurent dans le fichier tools.json du dépôt Tooling Invoker.

Réseau

Les outils s'exécutent sans accès à Internet. Tu peux utiliser deux configurations différentes :

  1. none. Cela désactive le périphérique réseau à l'intérieur du conteneur.
  2. internal. Cela ajoute un périphérique réseau à l'intérieur du conteneur, mais le réseau n'a accès à rien d'externe.

Les différents langages se comportent mieux ou moins bien selon les configurations (par exemple, Ruby est 2 fois plus rapide avec none. Elixir est 12x plus rapide avec internal.

Tu peux tester en local en passant l'option --network quand tu lances ton Docker. --network none est pris en charge par défaut. Pour utiliser le réseau interne, exécute d'abord docker network create --internal internal pour créer le réseau, puis utilise --network internal au moment de lancer le conteneur.

Mémoire

Les langages peuvent définir la mémoire maximale dont ils ont besoin pour exécuter leurs tâches. La fixer au plus bas possible permet d'exécuter plus de tâches en parallèle, et plus rapidement. Cela signifie aussi que les personnes qui tentent d'abuser de la mémoire ne pourront pas y parvenir. Les besoins en mémoire maximale varient énormément d'un langage à l'autre. Il est conseillé, et apprécié, de mesurer l'exécution d'un docker run pour établir la mémoire maximale qu'il utilise.

La mémoire devrait être spécifiée à l'aide du nombre suivi du suffixe b, k, m ou g, pour indiquer des octets, kilooctets, mégaoctets ou gigaoctets.

Lance Docker en local

Tu peux tester les paramètres ci-dessus avec cette commande :

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/

Modifie un Dockerfile

Toutes les modifications apportées aux Dockerfiles nécessitent une revue de PR de l'équipe @exercism/maintainers-admin, afin d'éviter l'introduction de failles de sécurité.