Для моей диссертации в университете я работаю над системой кодирования лидеров, где пользователи могут компилировать/запускать ненадежный код через временные контейнеры докеров. Кажется, что система работает хорошо, но одна проблема, с которой я столкнулся, заключается в том, что, когда отправляется код для бесконечного цикла, например:
while True:
print "infinite loop"
система переходит в сгусток. Проблема в том, что когда я создаю новый контейнер докеров, интерпретатор Python не позволяет докеру убивать дочерний контейнер, поскольку данные все еще печатаются в STDOUT (навсегда). Это приводит к огромной уязвимости докера, который съедает все доступные системные ресурсы до тех пор, пока машина, использующая систему, не замерзает (показано ниже):
Итак, мой вопрос: есть ли лучший способ установить тайм-аут в контейнере докера, чем мой текущий метод, который на самом деле будет убить контейнер докеров и сделать мою систему безопасной (код, первоначально взятый из здесь)?
#!/bin/bash
set -e
to=$1
shift
cont=$(docker run --rm "[email protected]")
code=$(timeout "$to" docker wait "$cont" || true)
docker kill $cont &> /dev/null
echo -n 'status: '
if [ -z "$code" ]; then
echo timeout
else
echo exited: $code
fi
echo output:
# pipe to sed simply for pretty nice indentation
docker logs $cont | sed 's/^/\t/'
docker rm $cont &> /dev/null
Изменить: время ожидания по умолчанию в моем приложении (передано переменной $to
) равно "10 с" /10 секунд.
Я попытался найти добавление таймера и sys.exit()
к источнику python напрямую, но это не очень эффективный вариант, поскольку он кажется довольно небезопасным, потому что пользователь может отправить код, чтобы он не выполнялся, что означает проблема все равно сохранится. О, радости застряли на диссертации...: (