Erstellen eines eigenen MediaWiki Docker Image
Möchte man sein MediaWiki durch einige Extensions, Skins oder sonstige eigenen Einstellungen anpassen, kann man dies über mehrere Wege machen, zum Beispiel das Mounten aller Anpassungen (Extensions/Skins/Sonstiger Dateien) in den Docker Container. Oder aber man erstellt sich auf Basis des offiziellen MediaWiki Docker Image, sein eigenes angepasstes Image, das man dann verwenden kann. Der Vorteil hiervon ist auch, dass man eine neue MediaWiki Version mit allen Updates erstmal testen kann, bevor man den Live Container austauscht. So kann man auch dafür sorgen das Skins und Extension des gleichen Branch herunter geladen werden, dem auch die MediaWiki Version entspricht. Die Idee ist nun folgende:
- Auf eine MediaWiki Version festlegen (hier 1.34)
- Extensions direkt in das Image klonen, mit dem Branch 1.34
- Das selbe mit den Skins, ebenfalls der Branch 1.34
- Zusätzliche Dateien in das Image kopieren:
- Favicons
- Apple Touch Icons
- Google Files (robots.txt, ads.txt)
- .htaccess Datei
- ggf. die LocalSettings.php (das ist denke ich Geschmacksache ob man diese direkt rein kopieren möchte)
Vorbereitung
Zuerst sollte man einen Ordner erstellen um dort alle Dateien, die man in das Image kopieren möchte reinzulegen. Ich habe diesen Ordner unter meinem Compose Projekt Ordner erstellt, da ich mein MediaWiki über Compose deploye.
mkdir /opt/mediawiki/data/mediawiki
Ich habe hier alle möglichen Dateien, die Google und die anderen Suchmaschinen so brauchen, die Favicons (Apple und Co) und eine Extension, die ich nicht via GIT herunterladen kann. Im Prinzip kann man hier einfach alles reinlegen, das später im Web Ordner liegen soll. Die Unterordner Struktur wird ebenfalls übernommen. Bei mir sieht es so aus:
-rw-r--r-- 1 root root 58 Feb 15 23:13 ads.txt -rw-r--r-- 1 root root 1588 Feb 15 23:12 android-chrome-192x192.png -rw-r--r-- 1 root root 2058 Feb 15 23:12 android-chrome-384x384.png -rw-r--r-- 1 root root 1551 Feb 15 23:12 apple-touch-icon.png -rw-r--r-- 1 root root 246 Feb 15 23:12 browserconfig.xml -rw-r--r-- 1 root root 1945 Feb 16 16:11 dockerfile -rw-r--r-- 1 root root 25 Feb 15 23:14 .dockerignore drwxr-xr-x 3 root root 4096 Feb 14 12:00 extensions -rw-r--r-- 1 root root 1251 Feb 15 23:12 favicon-16x16.png -rw-r--r-- 1 root root 1366 Feb 15 23:12 favicon-32x32.png -rw-r--r-- 1 root root 7406 Feb 15 23:12 favicon.ico -rw-r--r-- 1 root root 336 Feb 15 23:12 .htaccess -rw-r--r-- 1 root root 1139 Feb 15 23:12 mstile-150x150.png -rw-r--r-- 1 root root 167 Feb 15 23:13 robots.txt -rw-r--r-- 1 root root 839 Feb 15 23:12 safari-pinned-tab.svg -rw-r--r-- 1 root root 426 Feb 15 23:12 site.webmanifest extensions: total 12 drwxr-xr-x 3 root root 4096 Feb 14 12:00 . drwxr-xr-x 3 root root 4096 Feb 16 16:11 .. drwxr-xr-x 3 root root 4096 Jan 19 15:01 CategoryTagCloud
zu den beiden Dateien .dockerignore
und dockerfile
komme ich gleich.
Dockerfile
Nun kommen wir zum Dockerfile. Das dockerfile
ist die Bauanleitung für ein Docker Image. Es beinhaltet meist die folgenden Kommandos:
- FROM (Base Image)
- COPY (kopiert Dateien)
- RUN (startet ein Kommende im Image beim Build, z.B. Updates installieren)
- CMD (Das Kommando was beim starten des Containers ausgeführt werden soll)
Mehr findet ihr hier: https://docs.docker.com/engine/reference/builder/
Ich habe für mein MediaWiki folgendes dockerfile
angelegt:
FROM mediawiki:1.34 COPY . /var/www/html/ RUN git clone -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/CookieWarning /var/www/html/extensions/CookieWarning/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/GoogleAdSense /var/www/html/extensions/GoogleAdSense/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/googleAnalytics /var/www/html/extensions/googleAnalytics/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/Lockdown /var/www/html/extensions/Lockdown/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/WikiCategoryTagCloud /var/www/html/extensions/WikiCategoryTagCloud/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/Description2 /var/www/html/extensions/Description2/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/RelatedArticles /var/www/html/extensions/RelatedArticles/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/MobileFrontend /var/www/html/extensions/MobileFrontend/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor.git /var/www/html/extensions/VisualEditor/ && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/extensions/ContributionCredits /var/www/html/extensions/ContributionCredits/ && \ git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/extensions/SelectCategory /var/www/html/extensions/SelectCategory/ && \ cd /var/www/html/extensions/VisualEditor/ && git submodule update --init && \ git clone --depth 1 -b $MEDIAWIKI_BRANCH https://gerrit.wikimedia.org/r/mediawiki/skins/MinervaNeue /var/www/html/skins/MinervaNeue/
Es nutzt als Baseimage das 1.34er Image von MediaWiki, kopiert dann den Inhalt des obenstehendes Ordners und lädt dann alle Extensions im richtigen Branch via git.
Damit das dockerfile
und natürlich auch das .dockerignore
File nicht mit kopiert wird, gibt es die .dockerignore
Datei. hier schreibt man alle Dateien rein, die nicht ins Image kopiert werden sollen. bei mir sieht es so aus:
.dockerignore
.dockerignore dockerfile
Möchte man nun das Image Bauen, geht man in den Ordner, in dem das Dockerfile liegt, und startet dann einfach den Build Prozess:
cd /opt/mediawiki/data/mediawiki
docker build -t ala/mediawiki:1.34 .
-t
ist das Image Tag, das man vergeben kann. Bei mir mein Kürzel + Base Image
mit dem folgenden Befehl kann man dann verifizieren, das dass Image auch zur Verwendung bereit steht:
docker image ls
Jetzt könnte man einfach den MediaWiki Container aus dem Image heraus starten:
docker run --rm -p 8080:80 ala/mediawiki:1.34
Docker Compose Projekt
Da wir das MediaWiki über ein Compose Projekt starten wollen, muss man nun eine kleine Modifikation am docker-compose.yml
machen. Ich baue hier auf der folgenden Anleitung auf:
Also öffnen wir nun das docker-compose.yml
...
mediawiki:
build: ./data/mediawiki
image: ala/mediawiki:1.34
depends_on:
...
Wir fügen also den Build Pfad hinzu und sagen das wir das der Image Tag ein anderer ist. Gestartet oder besser gesagt deployt wird es dann folgendermaßen:
docker-compose up -d --build
Schon sollte euer angepasstes MediaWiki online sein