LXC: Automatisieren der Ausführung einer Anwendung in einem Container

1980
Ghijs Kilani

Ich arbeite an einem Projekt, das die Ausgabe der eingereichten Programme in C, C ++, Java und Python automatisch kompiliert, ausführt und testet. Offensichtlich muss dies in einer Art gesicherten Umgebung geschehen, da Code jeglicher Art übermittelt werden kann. Nachdem ich versucht hatte, den Container selbst mit einem Chroot-Gefängnis zu erstellen, was sich als unpraktisch herausstellte, wandte ich mich an Container.

Angenommen, ich habe ein C-Programm, das ein int iArgument als Argument annimmt und dieses zurückgibt i+1. Ich möchte ein Skript schreiben, das das C-Programm plusone.outzusammen mit einer Liste von input.txtTesteingaben ( ) in einen LxC-Container kopiert, das Programm innerhalb des Containers ausführt, die Ausgaben in eine Datei ( output.txt) schreibt und diese Datei exportiert zurück zum Hostsystem, damit die Hauptanwendung (die außerhalb des Containers ausgeführt wird) die Ergebnisse überprüfen kann. Es müssen auch einige Einschränkungen für die Ressourcen bestehen, aber ich kann dies mit der eingebauten cgroupsImplementierung von LxC tun .

Ich weiß, wie ich die meisten der oben beschriebenen Dinge erledigen kann, aber ich kann nicht herausfinden, wie ich Dateien vom Host in den Container oder umgekehrt kopiere. In jedem Lernprogramm, das ich sehe, wird das Verhalten durch Ausführen lsoder echoinnerhalb des Containers veranschaulicht, aber niemals ein Skript oder ein Programm vom Hostsystem importiert. Kann mir jemand helfen oder verweisen Sie mich möglicherweise auf eine Dokumentation, die mir sagen kann, wie ich das erreichen kann?

0
Sparen Sie sich viel Leid und schauen Sie in Docker. Michael Hampton vor 9 Jahren 1

1 Antwort auf die Frage

0
user71931

Läuft dies auf einem Webserver? Wenn dies der Fall ist, stellen Sie sicher, dass der Host und die Container wirklich gesperrt sind. Wenn es sich um eine öffentlich zugängliche Website handelt, stellen Sie sicher, dass Sie dies tun.

Kopieren Sie die Binärdatei direkt in das Container-Dateisystem

Gehen Sie davon aus, dass das Host-Executor-Programm über Root-Privilegien verfügt:

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

Rootfs ist das RAW-Dateisystem für den Container. Sie würden dann Ihr Skript ausführen, indem Sie Folgendes tun:

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

Wenn es nicht als Root ausgeführt wird, versuchen Sie, unprivilegierte Container zu verwenden (aus Sicherheitsgründen ist dies möglicherweise besser) . Sie können die Datei dann direkt in den Container kopieren, ohne dass root erforderlich ist. Stephane Graber (einer der LXC-Entwickler für Ubuntu) hat ein großartiges Intro in seinem Blog: Introduction to Unprivileged LXC Containers

Witzigerweise haben Sie diese Antwort an dem Tag eingereicht, an dem ich mein Projekt beendet habe. Ich ging mit Docker wie der Kommentator zu meiner vorgeschlagenen Frage, aber es scheint, dass Ihre Antwort sehr hilfreich gewesen wäre, wenn ich LXC gewählt hätte, also akzeptiere ich es trotzdem. Vielen Dank! Ghijs Kilani vor 8 Jahren 0
Fantastisch! Ich bin froh, dass es geholfen hat. user71931 vor 8 Jahren 0