Für uns als Java-Spezialisten war es anfänglich ein Schock: Container Images sind plattformabhängig! Baue ich bspw. mit Docker auf meinem Linux-System mit Intel-CPU ein Image, so ist es auf dem Macbook der Kollegin mit ARM-CPU nicht lauffähig. Letztere CPU-Architektur ist derzeit auch in der Cloud im Vormarsch begriffen, so dass Thema „Bauen von Images für mehrere Plattformen“ recht viel Bedeutung erlangt hat.
Grundsätzlich ist es so, dass in einer Container Registry mehrere plattformspezifische Images über ein sog. List Manifest unter einem gemeinsamen Namen zusammengefasst werden können. Beim Herunterladen („Pullen“) von Images bedient sich eine Container Runtime dann mit dem für sie passenden Image.
Früher musste man zur Erstellung von solchen Multi Architecture Images relativ viele aufwändige Schritte gehen. Das ist seit dem Erscheinen der Docker Build Extension einfacher geworden. Diese Extension integriert sich in den docker
-Befehl als Subkommando buildx
und ist in der Lage, Images mit Hilfe von Containern zu bauen, in denen die gewünschte Zielplattform emuliert wird.
Als erstes muss einmalig ein passender Builder im Docker Host erzeugt werden:
docker buildx create --name multi-arch-builder
Anschließend können mit Hilfe des neuen Builders Images für mehrere Plattformen gebaut und in einer Registry zu einem Multi Architecture Image zusammengefasst werden:
docker buildx build --platform linux/amd64,linux/arm64 --push -t registry.gedoplan.de/my/image .
Im Beispiel wird ein Image aus einem gedachten Dockerfile im aktuellen Verzeichnis für zwei verschiedene Plattformen gebaut und als Multi Architectiure Image in eine gedachte Container Registry gepusht.
Über Build Args – z. B. TARGETPLATFORM
– können im Dockerfile Verzeigungen o.ä. programmiert werden, wenn plattformabhängig unterschiedliche Build-Anweisungen benötigt werden.
Details finden sich in https://docs.docker.com/reference/ und näturlich in unseren Seminaren 😉