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

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:
| Format | wenn |
|---|---|
| Arbeitsbereich ist gleich dem getaggten Inhalt in Git | |
| - | Arbeitsbereich ist nicht gleich dem getaggten Inhalt |
| --dirty | Arbeitsbereich 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!
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.
Unsere Ideen
Weitere Blogs
Contact



