Composer unter Windows in einem Docker Container laufen lassen

Ein großer Vorteil von Docker ist die Möglichkeit, einzelne Programme nicht mehr fest auf dem Computer zu installieren sondern einfach in einem Docker Container, der alle Abhängigkeiten bereits mitbringt, auszuführen. Dadurch müllt man sich sein Betriebssystem weniger zu und außerdem kann man relativ einfach zwischen verschiedenen Versionen (wie beispielsweise PHP Versionen) hin und her wechseln.

In diesem Artikel kümmern wir uns um die Dockerisierung von Composer. Da Composer auf PHP basiert benötigen wir ebendieses um es auszuführen. Benutzen wir hingegen einfach das Composer Docker Image genügt ein einfacher Befehl um Abhängigkeiten zu installieren oder upzudaten. Dieses Tutorial bezieht sich auf Docker für Windows.

Das Composer Docker Image

Das Composer Docker Image bietet uns mehrere Tags an um optimal damit arbeiten zu können. So können wir beispielsweise verschiedene composer Versionen (wie 1.0 oder 1.1) verwenden, aber auch unter verschiedenen PHP Versionen ausführen lassen. Standardmäßig wird dabei PHP7 verwendet, aber auch PHP5 ist problemlos möglich.

Wenn wir uns diesen Container wie einen kleinen Computer vorstellen ist natürlich auch noch das Verzeichnis wichtig, in dem der Code dann später liegt. Das ist von Haus aus erstmal das Verzeichnis /app. Das ist deshalb so wichtig weil wir ohne Änderungen ansonsten die Abhängigkeiten nur innerhalb unseres Composer Containers installieren, sobald der Container dann beendet ist sind sie wieder weg. Allerdings haben wir ja dank der Volumes einfach die Möglichkeit, dieses /app Verzeichnis auf unseren eigenen Computer zu mounten.

Klingt kompliziert, ist aber im Prinzip ganz einfach:

  1. Wir starten einen Container und teilen Docker mit Hey du, alles was im Verzeichnis x auf meinem Computer ist soll bitte im Container im Verzeichnis /app zu finden sein. Und wenn sich im Container was ändert, mach diese Änderungen bitte auch auf meinem Computer.
  2. Mitgeliefert im Container ist bereits sowohl ein installiertes und konfiguriertes PHP als auch Composer. Das heißt wir können nun einfach beispielsweise composer install ausführen und composer wird automatisch im Verzeichnis /app nach einer composer.json suchen.
  3. Während die Abhängigkeiten installiert werden denkt sich Docker Hey, da ändert sich ganz viel in dem Verzeichnis. Dann sorg ich doch mal dafür, dass diese Änderungen auch im Computer passieren. Dadurch ist – nach dem Beenden des Containers – auch alles noch auf der Festplatte vorhanden und kann dann weiter verwendet werden (oder zum Beispiel durch composer update aktualisiert werden).

 

 

Composer in Docker ausführen

So, nach dieser kurzen Einführung geht es nun ans Eingemachte. Wie führen wir unseren Composer Befehl nun denn innerhalb des Containers aus?

Obwohl der Befehl lang aussieht ist er nicht so schwer. Brechen wir ihn in seine Bestandteile auf:

  1. docker run – Sorgt einfach dafür, dass ein Docker Container ausgeführt wird
  2. –rm – Entfernt den Container automatisch, nachdem er beendet wurde. Da alle wichtigen Dinge (nämlich die Abhängigkeiten, die wir installieren) ja nach außen synchronisiert werden, sparen wir dadurch Speicherplatz.
  3. -v $(pwd):/app – Das erzeugt ein Volume (also die Synchronisierung die wir oben angesprochen haben) und mappt das Verzeichnis in dem wir uns aktuell befinden ($(pwd)) ins Verzeichnis /app im Container. Hier gibt es unter Windows ein paar Besonderheiten, denen wir uns im nächsten Abschnitt noch widmen.
  4. composer/composer – Hier geben wir einfach das Composer Docker Image an, das wir verwenden möchten. Mit einem Doppelpunkt getrennt können wir an dieser Stelle auch das passende Tag auswählen.

Diese vier Komponenten ersetzen nun quasi den einfachen Befehl composer. Alles danach sind die Optionen, die wir dem Befehl mitgeben. Zum Beispiel install oder update. Das klingt jetzt nach sehr viel Aufwand aber natürlich können wir dabei noch abkürzen, auch das sehen wir uns gleich an.

 

 

Besonderheiten mit Windows und Git Bash

Ich selbst benutze Git Bash als Konsole während ich unter Windows arbeite. Das Problem dabei ist, dass Pfade dabei teilweise automatisch umgewandelt werden. So wird zum Beispiel aus dem Pfad /app im Befehl -v $(pwd):/app dann der Pfad /c/Program Files/Git/app was Docker leider gar nicht gefällt. Glücklicherweise gibt es dafür eine Lösung: Wir setzen den Pfad in einfache Anführungszeichen.

Das sähe dann so aus:

Leider macht auch das $(pwd) ein wenig Probleme, da der absolute Pfad /c/Test (zum Beispiel) Probleme erzeugt. Hier gibt es keine gute Lösung aber einen kleinen Workaround, nämlich können wir einfach vor das /c/Test noch einen weiteren Slash setzen. Also //c/Test. Möchten wir das dynamisieren funktioniert das ebenfalls wunderbar:

 

Ein composer Alias einrichten

Nun haben wir ja vorher schon festgestellt, dass es ziemlich mühsam wäre, den langen Docker Befehl immer wieder zu schreiben. Glücklicherweise können wir uns dafür in unserer Konsole sogenannte Alias einrichten. Da die vier Bestandteile von oben einfach nur ein Ersatz für den Composer Befehl sind können wir ein Alias dafür anlegen. Sinnvollerweise nennen wir das einfach composer.

Das funktioniert mit diesem Befehl:

Und schon können wir wie gewohnt den Befehl composer install verwenden.

Leider werden diese Alias nicht automatisch gespeichert sondern wären sofort wieder weg wenn wir die Konsole schließen. Möchten wir ein Alias dauerhaft benutzen legen wir dafür in unserem Homeverzeichnis (erreichbar durch cd ~) die Datei .bash_profile an. Diese wird beim Starten der Konsole automatisch ausgeführt. Hier können wir nun alle Alias einfach untereinander schreiben und jedes mal wenn wir eine Konsole starten sind sie wieder verfügbar. Achtung: Die Änderungen werden erst nach einem Neustart der Konsole übernommen!

 

Et voila – schon haben wir composer unter Windows dockerisiert. Ich hoffe, der Artikel hat dir weitergeholfen. Hast du noch ein paar Tipps und Tricks auf Lager? Lass es uns gerne in den Kommentaren wissen! Wir freuen uns darüber!

5 Kommentare zu “Composer unter Windows in einem Docker Container laufen lassen

  1. Hallo Frank

    Bin gerade dabei deine Docker Artikel durchzuarbeiten um das ganze Ökosystem ein wenig besser zu verstehen.

    Was ich noch nicht so ganz checke ist, wie ich von einem Dockerbefehl, wie du ihn hier schreibst in ein Dockerfile komme.

    Soweit ich das jetzt mal gecheckt habe würde es ja reichen in deinem beispiel ein Dockerfile zu generieren welches

    FROM composer/composer enthält oder?

    Und weiter könnte über eine docker-compose.yaml der App Pfad an den Container übergeben werden?

    Dann könnte man via docker-compose build und anschließend via docker-compose up -d (natürlich im korrekten Verzeichnis) den Container starten?!

    • Hi Thomas,

      sehr schön, ich kann Docker wirklich nur empfehlen. Auch wenn die Lernkurve etwas steil ist 🙂

      Das Dockerfile ist sowas wie eine Bauanleitung für einen Container. Du könntest es auch manuell machen (also Container von einem Image starten und dann im Container z.B. Sachen installieren). Aber das ist natürlich oft aufwendig, deshalb kann man es mit einem Dockerfile reproduzierbar machen.
      Wenn du den Composer Container allerdings verändern möchtest kann das durchaus Sinn machen – andernfalls musst du den docker Befehl trotzdem jedes mal ausführen.

      Docker Compose ist hauptsächlich für die Verknüpfung mehrerer Container gedacht. Es nimmt dir die Arbeit ab, mehrere Container zu starten / beenden, konfigurieren und miteinander verknüpfbar machen. Hast du z.B. 10 Container musst du nicht 10 Befehle ausführen um sie zu starten sondern nur docker-compose up. Theoretisch geht das aber natürlich auch mit einem Container, das ist richtig.

      Im Falle von Composer macht es nur nicht viel Sinn denn der Composer Befehl ist ja eine Art „Wegwerfbefehl“ – also man führt ihn aus (z.B. install) und danach läuft da keine Software die irgendwas macht – im Gegensatz zu einem Server wie z.B. Nginx.

      Grüße
      Frank

  2. Hi Frank,

    sehr schöner Artikel, vielen Dank.
    Ich stehe vor dem Problem, wenn ich unter einem Windows System composer über den Docker Container aufrufe und composer symlinks setzt, kann Windows damit nichts anfangen. Dort sehe ich dann nur Dateien dessen Inhalt mit „XSym“ anfängt.
    Hattest du evtl schon das Problem und einen Lösungsansatz?

    Viele Grüße
    Axel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*