Налаштування Docker


Різні інструменти для наших треків розгортаються як Docker-образи.

Кожен інструмент потребує Dockerfile, який визначає, як збирається машина. Він має лежати в корені репозиторію і називатися Dockerfile.

Dockerfile має створювати мінімальний образ, потрібний, щоб інструмент працював правильно й швидко. Наша сторінка з найкращими практиками містить багато порад, які допоможуть досягти цієї мети.

Виконання

Тайм-аути

Тест-раннер отримує 100% CPU і 3 ГБ памʼяті на 20-секундне вікно для кожного рішення. Після 20 секунд процес зупиняється і повідомляє про тайм-аут із кодом помилки 408.

Note

Ми наполегливо радимо дотримуватися нашого документа з найкращими практиками продуктивності, щоб зменшити ймовірність тайм-аутів.

Stdout/stderr

За один запуск інструмент може видати щонайбільше один мегабайт stdout і stderr. Якщо він видає більше, його буде зупинено з кодом помилки 413.

Вміст stdout і stderr з кожного запуску зберігається у файлах. Можна записати файл results.out у вихідний каталог, який містить налагоджувальну інформацію.

Caution

Зараз супровідники не можуть переглядати вміст цих файлів.

Результати

Файл результатів не може бути більшим за 500 кілобайт (включно з трасуваннями стеку тощо). Якщо файл більший, запуск інструмента буде зупинено з кодом помилки 460.

Налаштування

Кожне рішення отримує 100% ресурсів машини на 20 секунд. Після 20 секунд процес зупиняється і повідомляє про тайм-аут.

Деякі інструменти потребують (незначних) відхилень від типової конфігурації. Якщо так, це налаштовується у файлі tools.json у репозиторії Tooling Invoker.

Мережа

Інструменти запускаються без доступу до інтернету. Є дві різні конфігурації, які можна використати:

  1. none. Це вимикає мережевий пристрій усередині контейнера.
  2. internal. Це додає мережевий пристрій усередині контейнера, але мережа не має доступу ні до чого зовнішнього.

Різні мови працюють краще або гірше з різними конфігураціями (наприклад, Ruby удвічі швидша з none. Elixir у 12x швидший з internal.

Можна поекспериментувати локально, використавши прапорець --network під час запуску docker. --network none підтримується типово. Щоб скористатися внутрішньою мережею, спершу треба створити її командою docker network create --internal internal, а потім під час запуску контейнера використовувати --network internal.

Памʼять

Мови можуть задавати максимум памʼяті, потрібний їм для виконання завдань. Якщо встановити його якомога нижчим, ми зможемо запускати більше завдань паралельно й швидше. Це також означає, що люди, які намагаються зловживати памʼяттю, не досягнуть успіху. Різним мовам потрібні геть різні максимальні обсяги памʼяті. Ми радимо й будемо вдячні, якщо хтось виміряє продуктивність виконання docker run, щоб визначити максимум використаної памʼяті.

Памʼять треба вказувати числом із суфіксом b, k, m, g, який позначає байти, кілобайти, мегабайти або гігабайти.

Локальний запуск 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

Усі зміни до Dockerfile потребують перевірки PR від команди @exercism/maintainers-admin, щоб уникнути появи експлойтів.