Blog

Ein wiederverwendbares Makefile zum Erstellen und Veröffentlichen von Docker-Images

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 21, 2025
5 Minuten

In einer Continuous Delivery-Pipeline möchten wir sicherstellen, dass jedes Docker-Image auf einen bestimmten Git-Commit verweist. Mit diesem wiederverwendbaren Makefile stellen wir sicher, dass jedes Tag eine semantische Version hat und gleichzeitig auf den genauen Commit in Git verweist! Basierend auf dem aktuellen Stand Ihres Git-Arbeitsbereichs wird ein Docker-Image mit erzeugt:

  • ein sauberes Tag '1.0.0', wenn der Arbeitsbereich genau dem getaggten Commit entspricht.
  • ein Tag mit Release- und Commit-Hash '1.0.0-hash', wenn sich der Arbeitsbereich seit dem Tag geändert hat.
  • ein Tag '1.0.0-hash-dirty', wenn der Arbeitsbereich noch Änderungen aufweist. Sie können dieses Makefile als Basis verwenden und es für jedes Ihrer Docker-Projekte wiederverwenden.

Makefile-Ziele

Das Makefile hat die folgenden Ziele:

make showver    will show the current release tag based on the directory content.

make build         builds a new version of your Docker image and tags it
make snapshot   build from the current (dirty) workspace and pushes the image to the registry 
make release    build the current release and push the image to the registry

make patch-release  increments the patch release level, build and push to registry
make minor-release  increments the minor release level, build and push to registry
make major-release  increments the major release level, build and push to registry

make tag-patch-release  increments the patch release level, without build and push to registry
make tag-minor-release  increments the minor release level, without build and push to registry
make tag-major-release  increments the major release level, without build and push to registry

make check-status   will check whether there are outstanding changes
make check-release  will check whether the current directory matches the tagged release in git.

Wie Sie es verwenden.

kopieren Sie das Makefile und .make-release-support in Ihr Docker-Git-Projekt:

wget https://raw.githubusercontent.com/mvanholsteijn/docker-makefile/master/Makefile
wget https://raw.githubusercontent.com/mvanholsteijn/docker-makefile/master/.make-release-support

Registrierung, Benutzer oder Bildnamen ändern

Standardmäßig ist die Registry auf docker.io und der Benutzer auf den aktuellen Benutzer und der Name des Images
auf den Namen des aktuellen Verzeichnisses gesetzt. Um dies außer Kraft zu setzen, bearbeiten Sie das Makefile
und setzen die Variablen REGISTRY_HOST, USERNAME und NAME.

REGISTRY_HOST=myregistry.io
USERNAME=mvanholsteijn
NAME=awesome-image

Ein Bild erstellen

um ein Image zu erstellen, fügen Sie eine Dockerdatei in Ihr Verzeichnis ein und geben Sie ein:

make build

Wenn Sie das Bild, das auf dem aktuellen Arbeitsbereich basiert, in das Repository übertragen möchten, verwenden Sie:

make  snapshot

wird das Bild erstellt und mit dem aktuellen Tag in das Repository übertragen. Ein guter Befehl, den Sie auf Ihrem Continuous Integration Server ausführen können, da er bei jeder Übertragung Images mit individuellen Tags erstellt.

Freigabe

Um eine Version zu erstellen und zu kennzeichnen, übertragen Sie die Änderungen und geben Sie ein:

make patch-release

Dadurch wird die Patch-Release-Nummer erhöht, das Image erstellt und in die Registrierung übertragen. Es wird nur dann
release, wenn es keine ausstehenden Änderungen gibt und der Inhalt des Verzeichnisses mit dem markierten Inhalt übereinstimmt. Alternativ können Sie auch 'make minor-release' oder 'make major-release' wählen, um die zugehörige Nummer zu erhöhen.

Freigabe-Nummer

Die Version Ihres Docker-Images wird in der Datei .release gespeichert und hat das folgende Format:

release=<major>.<minor>.<patch>

Der Name des Git-Tags wird in der gleichen Datei gespeichert und hat standardmäßig das Format:

tag=<directory-name>-<major>.<minor>.<patch>

So können Sie mehrere Bilder in einem einzigen Git-Repository verfolgen und taggen. Wenn Sie ein anderes Tag-Präfix verwenden möchten, ändern Sie es in der .release.

Bildname und Tag

Der Name des Bildes wird wie folgt erstellt:

 <registry-host>/<username>/<directory-name>:<tag>

Der Tag hat das folgende Format:

Formatwenn
Arbeitsbereich ist gleich dem getaggten Inhalt in Git
-Arbeitsbereich ist nicht gleich dem getaggten Inhalt
--dirtyArbeitsbereich hat unübertragene Änderungen

Mehrere Docker-Images in einem einzigen Git-Repository.

Wenn Sie mehrere Docker-Images in einem einzigen Git-Repository verwalten möchten, können Sie ein alternatives Setup verwenden, bei dem sich das Makefile in einem Silbing-Verzeichnis befindet.

├── multiple-example
│   ├── ...
│   ├── image1
│   │   ├── .release
│   │   ├── Dockerfile
│   │   └── Makefile
│   ├── image2
│   │   ├── .release
│   │   ├── Dockerfile
│   │   └── Makefile
│   └── make
│       ├── .make-release-support
│       ├── Makefile

Das Makefile in den Image-Verzeichnissen enthält das generische Makefile. In diesem Makefile können Sie die Namen ändern und den Build anpassen, indem Sie Pre- und Post-Build-Ziele hinzufügen. Sehen Sie sich das Verzeichnis (multiple-example) für ein Beispiel an.

Erstellen Sie das generische make-Verzeichnis

Um das generische make-Verzeichnis zu erstellen, geben Sie ein:

mkdir make
cd make
wget  https://raw.githubusercontent.com/mvanholsteijn/docker-makefile/master/Makefile  
wget  https://raw.githubusercontent.com/mvanholsteijn/docker-makefile/master/.make-release-support

Docker-Image-Verzeichnis erstellen

Für jedes Docker-Image erstellen Sie ein Geschwisterverzeichnis:

mkdir ../image1
cd ../image1

cat > Makefile <<!
include ../make/Makefile

USERNAME=mvanholsteijn

pre-build:
    @echo do some stuff before the docker build

post-build:
    @echo do some stuff after the docker build
!

Jetzt können Sie die Anweisungen von make build und release verwenden, um diese Images zu erstellen.

Befehl pre-tag

Wenn Sie die aktuelle Version zu einer Quelldatei hinzufügen möchten, können Sie die Eigenschaft pre_tag_command zur .release-Datei hinzufügen.
wird dieser Befehl ausgeführt, wenn die .release-Datei aktualisiert wird und bevor das Tag platziert wird. In dem Befehl @@RELEASE@@ wird
durch die aktuelle Version ersetzt, bevor er ausgeführt wird. Zum Beispiel:

release=0.1.0
tag=v0.1.0
pre_tag_command=sed -i "" -e 's/^version=.*/version="@@RELEASE@@"/' setup.py

Fazit

Dieses wiederverwendbare Makefile macht es Ihnen sehr einfach, Docker-Images mit Tags zu erstellen, die den Status des Git-Workspace widerspiegeln, auf dem es erstellt wurde. Probieren Sie es aus und lassen Sie
mich wissen, ob es Ihnen das Leben erleichtert hat!


Tags:

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.