В этом каталоге расположены docker-файлы, которые будут использоваться для запуска решений.
В каждом docker-файле должны быть реализованы:
- Установка необходимого инструментария (размещается в секции
RUN
) для соответствующего языка (включая все необходимые библиотеки, среди которых обязательно должна быть библиотека для работы сjson
) - Серия ENV-переменных, в которых описывается компиляция (если нужна) и запуск принятого от игрока решения (включая пути к файлам и директориям, размечаются секциями
ENV
) - Базовая простейшая стратегия, которая просто едет к ближайшей еде (при подготовке
pull-request
-а можно взять за основу любую из уже выложенных вместе с изначальными docker-файлами)
Каждый docker-файл предполагает, что решение участника будет лежать в недрах папки /opt/client/
В каждом docker-файле доступна переменная $MOUNT_POINT
, в ней находится путь, по которому можно найти залитое решение пользователя (в момент компиляции/запуска не компилируемого языка). В момент запуска компилируемого языка там будет лежать бинарник.
Предполагается, что авторы pull-request
-ов будут писать docker-файл, ориентируясь на структуру уже существующих
- Желательно, на каждый файл обойтись одной
RUN
-секцией (в случае нескольких вызовов, можно элементарно обойтись&&
, напримерRUN apt-get install python python-pip && pip install sklearn
) - Каждый docker-файл наследуется от
ubuntu:16.04
- В каждом docker-файле должны быть определены в секциях
ENV
по меньшей мере такие переменные: RUN_COMMAND
- Команда, находящаяся в этой переменной, будет исполнена для старта стратегииSOLUTION_CODE_PATH
- В ней содержится путь к папке с исходниками (например, дляjava
этоENV SOLUTION_CODE_PATH=/opt/client/src/main/java/
)SOLUTION_CODE_ENTRYPOINT
- Здесь содержится путь к файлу (относительноSOLUTION_CODE_PATH
), который служит "точкой входа" в решении игрока. Для C++ этоENV SOLUTION_CODE_ENTRYPOINT=main.cpp
, для Go этоENV SOLUTION_CODE_ENTRYPOINT=main.go
итд
COMPILATION_COMMAND
. Будет вызвана во время компиляции (разница междуCOMPILATION_COMMAND
иRUN_COMMAND
в том, чтоCOMPILATION_COMMAND
вызывается один раз для присланного решения, таким образом мы экономим время и имеем возможность сразу же показать участникам ошибки компиляции)
Если в docker-файле явно не определены MOUNT_POINT
и SOLUTION_CODE_PATH
, то применяется:
ENV MOUNT_POINT=/opt/client/code
ENV SOLUTION_CODE_PATH=/opt/client/solution
В соответствии в docker-файлом для того языка, на котором прислано решение, происходит ровно следующее:
- Архив с решением разархивируется в директорию, указанную в
SOLUTION_CODE_PATH
docker-файла. Если решение пришло просто исходником, оно просто копируется вSOLUTION_CODE_PATH
/SOLUTION_CODE_ENTRYPOINT
- Если необходима стадия компиляции, то из директории
/opt/client/
вызывается команда, лежащая вCOMPILATION_COMMAND
- Если всё хорошо, запускается tcp-клиент
aicups
, которому отдается команда, лежащая вRUN_COMMAND
. Tcp-клиент запускает решение игрока, просто выполняя эту команду. С этого момента для решения игрока существует лишьSTDIN
,STDOUT
и набор библиотек, описанных в соответствующем docker-файле