2016-09-22 4 views
3

Ich arbeite an das Verschieben des Builds für ein C++ - Projekt in ein Docker-Image. Das Bild wird von einem Jenkins-Job erstellt und verschoben. Vor dem Docker habe ich ccache intensiv genutzt, um meine Builds auf Jenkins zu beschleunigen, besonders bei Builds, bei denen sich nur wenig geändert hat. Das Problem mit docker ist, dass der Build jetzt in einer isolierten Umgebung läuft, so dass ich nicht mehr von ccache profitieren kann. Gibt es eine Möglichkeit, innerhalb eines ephemeren Containers zu bauen, während man immer noch Ccache nutzt?Verwenden von Ccache beim Erstellen von Docker

Antwort

4

Sie können ccache immer noch in Verbindung mit Ihrem Build verwenden.

erstellen Data Volume Daten zu ermöglichen, zwischen Compilations zu beharren/Builds mit dem folgenden Befehl:

$ docker create -v /mnt/ccache:/ccache --name ccache debian 

Dann wird Ihren Container erstellen, dass „Mounts“ der Datencontainer oben mit der Option --volumes-from Befehlszeilen erstellt.

$ docker run -e CCACHE_DIR=/ccache --volumes-from ccache -it debian 

Sie werden nun in der Schale des debian Container sein und können die erforderlichen Anwendungen und Test ccache installieren:

[email protected]:/# apt-get update && apt-get install -y gcc ccache  

An diesem Punkt können Sie den Cache überprüfen, und es wird leer wie erwartet:

Das Datenvolumen bleibt erhalten, so dass der Cache auch nach dem Beenden des Containers noch vorhanden ist. Zukünftige Builds, die das Volume bereitstellen (und die Variable -e ENV angeben), verwenden den Cache.

Dann eine einfache Anwendung erstellen, ausführen und überprüfen Sie den Cache wieder:

[email protected]:/# cat > foo.c << __EOF__ 
int main(int argc, char **argv) 
{ 
    return 0; 
} 
__EOF__ 

[email protected]:/# PATH=/usr/lib/ccache:$PATH gcc -o foo.o -c foo.c 
[email protected]:/# ccache -s 
cache directory      /ccache 
cache hit (direct)      1 
cache hit (preprocessed)    0 
cache miss        1 
files in cache       2 
cache size        8 Kbytes 
max cache size      1.0 Gbytes 

Sie können den Cache sehen ist jetzt bevölkert, und baut weiter wird es wegen der Leistungsverbesserungen.

Das Datenvolumen bleibt bestehen, so dass der Cache auch nach dem Beenden des Containers noch vorhanden ist. Zukünftige Builds, die das Volume bereitstellen (und die Variable -e ENV angeben), verwenden den Cache.

Dieser Blog-Eintrag macht einen guten Job es zu erklären:

Using Ccache with Docker

+0

Das Problem ist, ein Bild als Ergebnis meiner Build (und ich könnte nur sein Mißverständnis), die ich will mich erstellen. Dieser Ansatz scheint ccache in einem Container zu verwenden, aber nicht mit einem Docker-Build-Befehl. –

+1

Sie können 'ccache' in Ihre Dockerfile mit dem' RUN 'Befehl einfügen, oder verwenden Sie Docker Compose, um das Volume während' docker-compose build' einzubinden und zu benutzen. Sie können einen Container auch mithilfe von 'docker commit' in einem Image speichern. –

+0

Ja, ich denke, die Kombination mit "docker commit" ist wahrscheinlich der beste Weg. Vielen Dank. –

Verwandte Themen