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

1926
Ghijs Kilani

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

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

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

0
Избавь себя от горя и загляни в Docker. Michael Hampton 9 лет назад 1

1 ответ на вопрос

0
user71931

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

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

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

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

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

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

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

Как ни странно, вы представили этот ответ в тот самый день, когда я закончил свой проект. Я пошел с Docker, как комментатор по моему предложенному вопросу, но похоже, что ваш ответ мог бы быть очень полезным, если бы я выбрал LXC, так что я все равно его принимаю. Спасибо! Ghijs Kilani 8 лет назад 0
Фантастика! Рад, что это помогло. user71931 8 лет назад 0

Похожие вопросы