LXC: Автоматизация запуска приложения внутри контейнера

LXC: Автоматизация запуска приложения внутри контейнера

Я работаю над проектом, который автоматически компилирует, выполняет и тестирует вывод отправленных программ на C, C++, Java и Python. Очевидно, что это должно происходить внутри какой-то защищенной среды, поскольку может быть отправлен любой код. После попытки создать контейнер самостоятельно с помощью chroot jail, что в итоге оказалось непрактичным, я обратился к контейнерам.

Теперь, скажем, у меня есть программа на C, которая принимает int iаргумент as и возвращает его i+1. Я хочу написать скрипт, который копирует программу на C (скажем, plusone.out) вместе со списком тестовых входов ( input.txt) в контейнер LxC, выполняет программу внутри контейнера, записывает выходные данные в файл ( ) и экспортирует этот файл обратно в хост-систему, чтобы основное приложение (которое работает вне контейнера) могло проверить результаты. Также должны быть некоторые ограничения на ресурсы, но я могу сделать это с помощью встроенной реализации output.txtLxC .cgroups

Я знаю, как делать большую часть из того, что описано выше, но я не могу понять, как копировать файлы с хоста в контейнер или наоборот. Все руководства, которые я вижу, демонстрируют поведение при запуске lsили echoвнутри контейнера, но никогда не импортируют скрипт или программу из хостовой системы. Может ли кто-нибудь помочь мне или, возможно, направить меня к документации, которая может подсказать, как это сделать?

решение1

Работает ли это на веб-сервере?Если так, убедитесь, что хост и контейнеры действительно заблокированы. Если это на общедоступном веб-сайте, убедитесь в этом еще раз (кажется, вы знаете, как это делать, но я подумал, что стоит упомянуть об этом)

Скопируйте двоичный файл непосредственно в файловую систему контейнера.

Предполагая, что ваша хостовая программа-исполнитель имеет права root, попробуйте следующее:

cp test_runner /var/lib/lxc/<container_name>/rootfs/tmp/

Rootfs — это сырая файловая система для контейнера. Затем вы можете выполнить свой скрипт, сделав что-то вроде:

lxc-attach -n container -- /tmp/testprogram

Если он не запущен от имени root, попробуйте использовать непривилегированные контейнеры.(на самом деле это может быть лучше с точки зрения безопасности). Затем вы можете скопировать файл напрямую в контейнер без необходимости root. Стефан Грабер (один из разработчиков lxc для Ubuntu) написал отличное введение в своем блоге:Введение в непривилегированные контейнеры LXC

Связанный контент