Ich arbeite an einem Projekt, das die Ausgabe übermittelter Programme in C, C++, Java und Python automatisch kompiliert, ausführt und testet. Dies muss natürlich in einer sicheren Umgebung geschehen, da jede Art von Code übermittelt werden kann. Nachdem ich versucht hatte, den Container selbst mit einem Chroot-Jail zu erstellen, was sich als nicht praktikabel herausstellte, habe ich mich Containern zugewandt.
Nehmen wir nun an, ich habe ein C-Programm, das ein int i
as-Argument annimmt und dieses zurückgibt i+1
. Ich möchte ein Skript schreiben, das das C-Programm (sagen wir plusone.out
) zusammen mit einer Liste von Testeingaben ( input.txt
) in einen LxC-Container kopiert, das Programm innerhalb des Containers ausführt, die Ausgaben in eine Datei ( output.txt
) schreibt und diese Datei zurück in das Hostsystem exportiert, damit die Hauptanwendung (die außerhalb des Containers ausgeführt wird) die Ergebnisse überprüfen kann. Es müssen auch einige Einschränkungen bei den Ressourcen vorhanden sein, aber das kann ich mit der integrierten cgroups
Implementierung von LxC tun.
Ich weiß, wie man die meisten der oben beschriebenen Dinge macht, aber ich kann beim besten Willen nicht herausfinden, wie man Dateien vom Host in den Container oder umgekehrt kopiert. Jedes Tutorial, das ich sehe, demonstriert das Verhalten durch Ausführen ls
oder echo
innerhalb des Containers, aber nie durch Importieren eines Skripts oder Programms vom Hostsystem. Kann mir jemand helfen oder mich möglicherweise auf eine Dokumentation verweisen, die mir erklärt, wie das geht?
Antwort1
Läuft dies auf einem Webserver?Wenn ja, stellen Sie sicher, dass der Host und die Container wirklich gesperrt sind. Wenn es sich um eine öffentlich zugängliche Website handelt, stellen Sie doppelt sicher (es klingt, als wüssten Sie, wie das geht, aber ich wollte es erwähnen).
Kopieren Sie die Binärdatei direkt in das Containerdateisystem
Vorausgesetzt, Ihr Host-Executor-Programm verfügt über Root-Rechte, versuchen Sie Folgendes:
cp test_runner /var/lib/lxc/<container_name>/rootfs/tmp/
Rootfs ist das Rohdateisystem für den Container. Sie führen Ihr Skript dann folgendermaßen aus:
lxc-attach -n container -- /tmp/testprogram
Wenn es nicht als Root ausgeführt wird, versuchen Sie, nicht privilegierte Container zu verwenden(aus Sicherheitsgründen könnte dies tatsächlich besser sein). Sie können die Datei dann direkt in den Container kopieren, ohne Root-Zugriff zu benötigen. Stephane Graber (einer der lxc-Entwickler für Ubuntu) hat eine tolle Einführung in seinem Blog:Einführung in nicht privilegierte LXC-Container