Einfache TYPO3 Entwicklung mit Docker

Docker

Als ich vor ein paar Tagen meine erste Entwicklungsumgebung, mit Docker für TYPO3 anlegen wollte, bekam ich zunächst Probleme bei der Installation von Docker for Mac. Meine CPU ist zu alt und wird von der aktuellen Docker Version für Mac nicht unterstützt. Recht schnell fand ich Docker Desktop, welches scheinbar speziell für ältere Rechner zur Verfügung gestellt wird. Cool, Docker läuft.

Für TYPO3 fand ich das Image martinhelmich/typo3. Martin beschreibt sehr gut in seinem Blog wie man damit umgeht. Was er leider nicht verrät, ist wie man damit Dateien auf dem Host bearbeiten kann. In den Kommentaren findet sich zwar ein Ansatz:

$ docker run -d --name typo3-web --link typo3-db:db \
    --volume /pfad/zum/projekt/typo3conf:/var/www/typo3conf \
    --volume /pfad/zum/projekt/fileadmin:/var/www/fileadmin \
    --volume /pfad/zum/projekt/uploads:/var/www/uploads
 

Und damit werden die Host Verzeichnisse auch in den Container eingebunden, aber die Rechte der Verzeichnisse passen nicht, da die Rechte des Hosts übernommen werden. Sehr ärgerlich, denn mit einem readonly /typo3conf kann man nicht viel mit TYPO3 anfangen.

Aber man muss ja auch gar nicht das komplette /typo3conf mounten. Mir genügt es wenn ich meine Extension Verzeichnisse auf dem Host anlegen kann und sie einzeln in das Container /typo3conf Verzeichnis mounte.

$ docker run -d --name typo3-web --link typo3-db:db \
    --volume /pfad/zum/projekt/typo3conf/my_new_extension:/var/www/typo3conf my_new_extension
 

Container Daten auf den Host kopieren:

docker cp ###deine_container_id###:/var/www/html/fileadmin/introduction/ /pfad/zum/projekt/
 

Damit ich nun nicht immer meine Container einzeln starten muss, habe ich mir diese docker-compose.yml angelegt.

version: "2"
services:
  mysql:
    image: ${DB_IMAGE}
    container_name: ${APP_NAME}_database
    command:
      - --character-set-server=utf8
      - --collation-server=utf8_unicode_ci
    environment:
      - "MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}"
      - "MYSQL_DATABASE=${DB_NAME}"
      - "MYSQL_USER=${DB_USER}"
      - "MYSQL_PASSWORD=${DB_PASSWORD}"
    volumes: 
      - database:/var/lib/mysql   
  extensions:
    image: busybox
    container_name: ${APP_NAME}_extensions
    volumes:
      - ./Extensions/lgv_site_package:/var/www/html/typo3conf/ext/lgv_site_package
  typo3:
    image: martinhelmich/typo3:${TYPO3_VERSION}
    container_name: ${APP_NAME}_typo3_${TYPO3_VERSION}
    ports:
      - ${APP_PORT}:80
    volumes:
      - fileadmin:/var/www/html/fileadmin
      - typo3conf:/var/www/html/typo3conf
      - uploads:/var/www/html/uploads
    volumes_from:
      - extensions
    links: 
      - mysql:db
volumes:
  database:
  fileadmin:
  typo3conf:
  uploads:
 
APP_NAME=T3_Docker
APP_PORT=80
TYPO3_VERSION=latest
DB_IMAGE=mysql:5.7
DB_ROOT_PASSWORD=root
DB_NAME=typo3
DB_USER=typo3
DB_PASSWORD=typo3

Wie anfangs erwähnt ist mein MAC schon etwas älter. Bislang habe ich meine lokale Entwicklung mit MAMP umgesetzt. Aktuell stand ich aber vor einem Problem. TYPO V9 benötigt PHP 7.2. Aber PHP 7.2 ist mit meinem auch etwas älterem MAMP nicht verfügbar. Dank Docker ist das alles nun kein Problem mehr.

Ubuntu mit Gnome als Desktop Umgebung

Ich arbeite seit nun schon fast 2 Wochen nahezu ausschliesslich mit Ubuntu 9.04 und Gnome als Desktopumgebung. Linux auf dem Desktop war wie ich finde in den letzten Jahren sehr unbefriedigend da man früher oder später immer auf irgendwelche Probleme gestossen ist. Große Probleme hatte ich immer mit meinem WLAN oder wenn man unter Wine PSPad laufen lassen wollte (ich habe früher aber fast immer mit SUSE experimentiert).

Mit Ubuntu 9.04 Jaunty Jackalope bin ich bislang auf keine der alten Probleme gestossen. Ganz im Gegenteil hier funktioniert fast alles auf Anhieb. Und wenn mal nicht dann findet man dank der großartigen Community schnell im Netz die Lösungen.

Da ich natürlich nicht ganz auf Windows verzichten kann als Programmierer habe ich mir einfach mittels Virtualbox eine virtuelle Maschine angelegt in der ich ein Windows laufen lasse. Man kann entweder die Virtualbox Version aus dem Repo nehmen, die läuft auch sehr gut. Aber will man auch Zugriff auf USB Geräte haben dann muss man die oben verlinkte Virtualbox Version von Sun installieren.

Wer PSPad kennt wird ihn unter Linux sehr vermissen. Da gibt es meiner Meinung nach auch nichts vergleichbares. Bluefish ist ganz gut vor allem weil er auch FTP Verbindungen verwaltet. Aber vom Leistungsumfang kommt er an PSPad nicht ran. Obwohl ich sehr skeptisch war habe ich PSPad dann aber doch einfach mal mittels Wine (was auch mit vorinstalliert ist) den PSPad installiert. Und siehe da, PSPad läuft einwandfrei.

Mit IEs4Linux kann man sogar den IE6 automatisch mit Wine installieren lassen (und der läuft dann sogar richtig gut in Gnome). Es gibt auch die Möglichkeit den IE7 mit zu installieren aber der läuft bei mir zumindest gar nicht. Aber dafür habe ich ja mein virtuelles Windows installiert.

Insgesamt bin ich mehr als zufrieden mit meinem neuen Ubuntu Laptop und kann es nur weiter empfehlen.

OpenSuse Online Installation mit VMware

Gestern habe ich das aktuelle OpenSuse 11.1 auf einem VMware Server via FTP-Source installiert. Das funktionierte heute super einfach. Lasst euch nicht von veralteten Tutorials entmutigen! Zunächst lädt man sich die auf Mini-CD herunter. Bei Punkt 2 muss man hier Network auswählen und bekommt dann weiter unten den Link zu dem ISO Abbild.

Dieses Abbild kann man entweder auf eine bootfähige CD brennen, oder aber man mounted das Abbild wie ich mit Daemon Tools. Startet man VMware danach wird automatisch das entsprechende CD Laufwerk gefunden und verwendet.

Nun beginnt auch schon die Installation von OpenSuse. Im Gegensatz zu früher wurde die Auswahl der FTP-Sourcen bereits in die Installationsroutine eingebunden. Man muss also nicht mehr lange nach den richtigen FTP Servern suchen sondern kann direkt mit der Online Installation beginnen. Wie man die Opensuse Installation durchführt beschreibe ich hier aber nicht. Ich finde es einfach nur erwähnenswert das die Online Installation so einfach und unkompliziert funktioniert denn auch ich hatte mich hier gestern anfangs von diversen Tutorials verwirren lassen die offenbar alle veraltet sind!

Time Out im Kulturkosmos

Nachdem ich nun beinahe schon 1 1/2 Jahre ohne Urlaub oder ähnlichem auskommen musste, und nahezu ununterbrochen an diversen Web-Projekten gefeilt habe, ist es nun an der Zeit sich mal für ein paar Tage auszuklinken. Die kommenden 3 Tage werden also ohne Telefon und Emails verbracht werden denn der Kulturkosmos auf dem Flugplatz Lärz ruft zu seinem alljährlichen Fusion Festival.

suchen und ersetzen mit sed

Mit sed kann man nach Strings suchen und diese dann durch andere ersetzen. Hört sich recht simpel an, doch in der Praxis kann dies sehr tricky werden wenn man so wie ich gerade erst an der Oberfläche der Shell Programmierung kratzt.

Ich hatte es schon erwähnt, ich tüfftel gerade (wenn ich die Zeit dazu finde) an einem Script welches mir Typo3 installieren soll. Dieses Script funktioniert auch schon sehr gut aber ich habe es noch erweitert, so dass auch gleich ImageMagick mit installiert wird. In der localconf.php muss das Script dann aber auch den Pfad zu ImageMagick ersetzen. Und ein Pfad ist kein einfacher String mehr da in ihm / vorkommen. Das Problem bestand für mich heute nun also nicht einfach nur darin sed anzuwenden um einfach einen String zu ersetzen sondern eine String mit Slashes.

Um die MySQL Daten in die localconf.php zu schreiben verwende ich ebenfalls sed. Dies sind aber wirklich nur einfache Strings. Um den Pfad zu ImageMagick über eine Variable die den Pfad enthält, und automatisch vom Script erzeugt wird, nun mit sed in der localconf.php zu ersetzen kann man da nicht so vorgehen wie es bei den simplen Strings der MySQL Daten möglich ist.

Nach relativ kurzer Zeit bin ich dann durch intensives googlen doch noch zu meinem gesuchten Code-Schnipsel gekommen der es ermöglicht die Slashes in der Variable von sed ignorieren zu lassen und den Pafd vernünftig in die localconf.php zu schreiben.

So funktioniert es wenn KEINE Slashes in der Variable vorkommen:
sed 's.gesuchterString.'$variable'.g' localconf.php > localconf_neu.php

Und so klappts auch mit Slashes:
sed -e 's%'gesuchterString'%'$variable'%g' localconf.php > localconf_neu.php

Damit wird nun eine präparierte localconf.php an den entsprechenden Stellen mit den nötigen Variablenwerten ersetzt und in /typo3conf abgelegt. Auf meinem eigenen kleinen Server hier funktioniert das Script jetzt schon einwandfrei. Aber ich werde es jetzt erst noch auf ein paar anderen Servern testen und wenn alles funktioniert stelle ich es hier auch nochmal detaliert vor.