Mein erstes Docker Image mit dem M1 MacBook

Julian | Oct 14, 2022 min read

Long story short

docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --push --tag user/image-name --platform=linux/arm64,linux/amd64 .

Ausgangssituation

Ich war immer noch in den ersten Zügen in die Mac Welt einzutauchen, als mir auffiel, dass es eine neue PHPBB3 Version gibt und ich diese in mein docker Image einpflegen wollte. Gesagt getan, neue Version und neuen sha256 verifier ins das Dockerfile gehackt und gleich mal

docker build . -t <imageTag>

Nachdem build, der auch wie erwartet ganz gemütlich und erfolgreich durchlief, das Ganze einmal lokal testen. Dazu einfach schnell das Forum mit der vorbereiteten docker-compose.yaml gestartet, alles läuft wunderbar. Also ab mit dem Image in den DockerHub und auf dem Server schnell mal einen docker / docker-compose pull ausgeführt und schon: Ist das Forum nicht mehr erreichbar. Das Unheil nahm nun seinen lauf.

Recherche

Zu nächst nahm ich an das es an der Software selbst liegt, also das die bestehenden Daten nicht mit der neuen Version klar kommen, da ich lokal natürlich mit einer leeren Datenbank getestet hab. Also habe ich mich durch die Logs gefressen um eine Ursache zufinden, hier konnte ich bei genauerem hin sehen allerdings nur Fehlermeldungen finden, die erst einmal keinen Sinn ergaben, da sich unterschiedliche Komponenten beschwert haben das sie Ordner nicht finden würde oder auf diese nicht schreiben dürften oder, oder oder.

Wir kommen der Sache näher

Alle Ordner waren mit entsprechenden Rechten vorhanden, also kann es nicht daran liegen. Also stellte ich mir die Frage: Was ist der unterschied zu vorher?

  • Neue Software Version
  • Ich hab das Image nicht unter Linux gebaut:
    • Ich hab schon öfter von Problemen mit M1 Chips gelesen, bzw. von notwenigen Plattformspezifischen Anomalien.

Also immerhin ein Anhaltspunkt und schon hat ein wenig Recherche ergeben, dass wir uns buildx anschauen müssen, nachdem ich auch viele Einträge gesehen habe á la DOCKER_BUILDKIT=0 COMPOSE_DOCKER_CLI_BUILD=0 docker command usw. Aber warum sollte ich build-kit ausschalten wollen, docker ist doch Plattform unabhängig zumindest in der Theorie. Und build-kit scheint ja auch seine Existenzberechtigung zu haben? Also müssen wir die uns gegebenen Werkzeuge nur verstehen und richtig verwenden.

Das Problem

Eigentlich sollten docker builds per default für die Plattform linux/amd64 gebaut werden, dies ist aber nicht der Fall gewesen in meiner normalen frisch installierten Docker Desktop Umgebung (ja ich war zu faul mir über Umwege nur die docker-engine zu installieren). Somit wurde das Image einfach nur für die falsche Plattform gebaut und dies war der Grund warum der Linux Server auf dem Docker läuft nichts mit dem Image anfangen konnte. Und da ich vorher in einer Homogenen Landschaft unterwegs war, Linux PC und Linux Server, habe ich mir darüber auch nie gedanken gemacht.

Die Lösung

Wie ich schon sagte, die uns gegebenen Werkzeuge richtig verwenden:

docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --push --tag user/image-name --platform=linux/arm64,linux/amd64 .

Was machen wir mit den drei Zeilen dort oben?

  • Zeile 1: Einen neuen builder anlegen mit dem namen: mybuilder
  • Zeile 2: buildx mitteilen das es mybuilder verwenden soll
  • Zeile 3: Den docker build mit buildx ausführen und dabei direkt das Image in die registry pushen und hier geben wir auch die Plattform(en) an, für die dieses Image gebaut werden soll. Das ist des Rätsels Lösung, falls ich die Fehlermeldungen noch finde ergänze ich diese in diesem Beitrag noch.