2016-04-25 5 views
0

Ich implementiere einen Docker-Container, um meinen Code zu kompilieren, der in C++ ist. Plattformen, die von meinem Code unterstützt werden, sind Windows, Linux und Mac OSX.Fügen Sie Ihre Anwendung einem Docker-Image hinzu

Ich benutze clang auf meinem Mac-Computer, um den Code zu kompilieren; gcc unter Linux und Microsoft Compiler (cl) unter Windows. Die Idee ist, einen Docker-Container zu erstellen und die Builds (sowohl von Linux als auch von Mac) auf dem Windows-Rechner selbst (innerhalb eines Docker-Containers) auszuführen, so dass ich den Code nicht an git weitergeben muss; dann zieh es von meinem Mac-Rechner und baue dann und so weiter.

Das Bild, das ich benutze, um Mac-Build (seit ich clang auf Mac OSX verwende) zu verwenden, ist https://hub.docker.com/r/rsmmr/clang/.

Ich möchte zu diesem Bild eine ausführbare Datei hinzufügen, die zu Testzwecken dient. Es heißt "Testapp". Das Bild sollte folgende Komponenten haben: Basis OS + Clang + Testapp.

Wie kann ich meine ausführbare Datei 'testapp' (sprich: application/utlity) zu diesem Bild 'rsmmr/clang' hinzufügen (was ich aus dockerhub gezogen habe)?

Mache ich dies über Dockerfile (wie?)? Gibt es eine andere Möglichkeit, dasselbe zu erreichen?

Antwort

0

Einer der einfachen Weg, dies zu lösen ist meine Montage Ihrer Quelle/Binär-Testapp auf die clang Bild.

Um dies zu demonstrieren, habe ich eine testapp.cc mich und es sah wie folgt aus:

[[email protected] add_application_docker_image]$ cat testapp.cc 
#include <iostream> 

using namespace std; 

int main() 
{ 
    cout << "Hello World!" << endl; 
    return 0; 
} 
[[email protected] add_application_docker_image]$ 

Dann startete die rsmmr/clang Container von meinem lokalen Verzeichnis auf dem Behälter vorbei und die Kompilation Befehl wie folgt ausgeführt werden:

[[email protected] add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /opt/llvm/bin/clang++ --std=c++11 --stdlib=libc++ /mnt/testapp.cc -o /mnt/a.out 
[[email protected] add_application_docker_image]$ 

Danach wird die a.out in Ihrem lokalen Verzeichnis (wie es in den Behälter montiert wurde).

Wenn Sie diese Binärdatei innerhalb des Containers ausführen möchten, können Sie dies auch tun.

[[email protected] add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /mnt/a.out 
Hello World! 
[[email protected] add_application_docker_image]$ 

Sie könnten ähnliche Dinge auch mit anderen Compilern machen. Ich habe keine Windows-Maschine, aber es sollte funktionieren :) War so etwas wie Sie wollte?

Lassen Sie mich wissen, wie es ging.

Danke,

  • Anoop
+0

Danke für Ihre Eingaben :) – vintrojan

+0

Was ich will ist die 'a.out', ein Teil des Bildes zu sein. Ich habe 'a.out' fertig gemacht. Nun möchte ich a.out mit diesem Docker-Image integrieren; so dass, wenn ich dieses Bild auf eine andere Maschine nehme und dieses Bild ausführen, um einen Container zu erstellen; Ich habe ein.out in diesem Container verfügbar. – vintrojan

0

Wenn Sie bereit sind, dies zu tun Ihre eigene Dockerfile durch das Erstellen und Ihr eigenes Bild machen.

Ihre Dockerfile Beginnen Sie mit

FROM install-clang 

Dann fügen Sie, was Sie brauchen.

COPY a.out directoryinthecontainer/ 

Wenn Sie weitere Maßnahmen müssen bei der Erstellung des Bildes genommen werden, verwenden

RUN apt-get morepackage && execute mycommand && unpack somefile.tar 

Sie erhalten das Bild: diese kann jedes Betriebssystem Befehle, die Sie mögen. Wenn Sie möchten, dass App als Kernstück des neuen Bild hinzufügen

ENTRYPOINT ["directoryinthecontainer/a.out", "-myoptions"] 

oder

CMD ["directoryinthecontainer/a.out", "-myoptions"] 

Es gibt subtile Unterschiede ausgeführt werden, wenn Sie ENTRYPOINT, RUN oder CMD verwenden würde, die auf abhängen Ihr Anwendungsfall.

Sehen Sie die Dockerfile Reference um herauszufinden, was Sie tun können, was Sie wollen.

Edit: Ich dachte, ich den nächsten Schritt klären würde: ‚‘

Verwenden Sie Ihre Dockerfile Ihr eigenes Bild mit

docker build -t myrepo/myimage:mytag . 

Vergessen Sie nicht, dass zu schaffen (Punkt) am Ende der Befehlszeile!

Von nun an können Sie Ihr eigenes Bild verwenden, um einen Container zu erstellen, der alles von der ursprünglichen CLANG one plus Ihre zusätzlichen Funktionen macht. Es ist eines meiner Lieblingsfeatures! :)

+0

Danke für Ihre Eingabe :). Ich werde weiter erkunden. – vintrojan