Erstellen eines eigenen MediaWiki Docker Image

Aus Laub-Home Wiki

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:

  1. Auf eine MediaWiki Version festlegen (hier 1.34)
  2. Extensions direkt in das Image klonen, mit dem Branch 1.34
  3. Das selbe mit den Skins, ebenfalls der Branch 1.34
  4. 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

Quellen