Docker-basiertes Build von C/C++-Anwendungen

English Deutsch

Hinweis: Basierend auf diesem Beitrag habe ich buildock auf GitHub veröffentlicht.

Viele C/C++-Programmierer und Projektmanager kennen den Schmerz, eine reproduzierbare Build-Umgebung für alle Entwickler zu schaffen: Works for me ist nicht ohne Grund ein verbreitetes Meme.

Mein Ansatz ist es, nicht zwingend die Anwendung selbst zu dockerisieren, sondern das Build-System – dabei werden sowohl die spezifische Compilerversion als auch das System drumherum inklusive aller benötigten Systemebenen-Bibliotheken in einem Docker-Image gekapselt.

Nehmen wir das obligatorische Hello World in C++:

main.cpp
// main.cpp
#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

und das entsprechende Makefile:

Makefile
all:
    g++ -o helloworld main.cpp

Wie können wir dieses einfache Projekt kompilieren, ohne einen Compiler und GNU make auf dem lokalen Rechner zu installieren (kein Schummeln durch Build-Server erlaubt)?

Eigentlich ist es recht einfach:

docker-run.sh
docker run --user $(id -u):$(id -g) -v $PWD:/app -it ulikoehler/ubuntu-gcc-make make

Aufgeschlüsselt:

Hier ist das vollständige Dockerfile, das zum Erstellen von ulikoehler/ubuntu-gcc-make verwendet wird:

Dockerfile
FROM ubuntu:18.04
RUN apt update && apt -y install build-essential make && rm -rf /var/lib/apt/lists/*
WORKDIR /app
CMD [ "/usr/bin/make" ]

Check out similar posts by category: Build Systems, C/C++, Container, Docker