docker dokuwiki Teil2

Zielsetzung

Behebung einiger Schwächen des ursprüngliche Dockerimages, durch anpassen des Dockerfiles:

  • plugin installation|backup
  • md5sum überprüfung des Downloads
  • Automatisiertes Backup

optional – Abspeichern des Images in einer eigenen Registry

Buildumgebung vorbereiten


mig@wz:~$ git clone https://github.com/istepanov/docker-dokuwiki
Klone nach 'docker-dokuwiki' ...
remote: Counting objects: 106, done.
remote: Total 106 (delta 0), reused 0 (delta 0), pack-reused 106
Empfange Objekte: 100% (106/106), 18.93 KiB | 0 bytes/s, Fertig.
Löse Unterschiede auf: 100% (47/47), Fertig.
mig@wz:~$ cd docker-dokuwiki/
mig@wz:~/docker-dokuwiki$ ls -al
insgesamt 36
drwxr-xr-x 3 mig mig 4096 Feb 8 14:38 .
drwxr-xr-x 24 mig mig 4096 Feb 8 14:38 ..
-rw-r--r-- 1 mig mig 2288 Feb 8 14:38 Dockerfile
drwxr-xr-x 8 mig mig 4096 Feb 8 14:38 .git
-rw-r--r-- 1 mig mig 1086 Feb 8 14:38 LICENSE
-rw-r--r-- 1 mig mig 1579 Feb 8 14:38 nginx.conf
-rw-r--r-- 1 mig mig 3936 Feb 8 14:38 README.md
-rwxr-xr-x 1 mig mig 194 Feb 8 14:38 start.sh
-rw-r--r-- 1 mig mig 476 Feb 8 14:38 supervisord.conf

Ein kurzer Blick in die LICENSE Datei, wir dürfen ändern, publizieren, usw solang die MIT-LIZENZ nicht verändert wird.

ein erster Testbuild

Nun werden wir mal überprüfen ob sich das Image erstellen läßt

docker build -t dokuwiki-ssl .

Der Output ist relativ umfangreich und gibt detailierte Informationen zum build Prozess


mig@wz:~/docker-dokuwiki$ docker build . -t dokuwiki-ssl
Sending build context to Docker daemon 83.46 kB
Step 1/13 : FROM alpine:3.4
3.4: Pulling from library/alpine
b7f33cc0b48e: Already exists 
Digest: sha256:a4104316f43c73146f1c0af4747d88047a808e58238bcad6506a7fbbf3b30b90
Status: Downloaded newer image for alpine:3.4
 ---> 0766572b4bac
Step 2/13 : MAINTAINER Ilya Stepanov <dev@ilyastepanov.com>
 ---> Running in ed5efbdacde1
 ---> aec3a09b97bf
Removing intermediate container ed5efbdacde1
Step 3/13 : ENV DOKUWIKI_VERSION 2016-06-26a
 ---> Running in 5dcf5e5e1075
 ---> 3f6f89ac4bcb
Removing intermediate container 5dcf5e5e1075
Step 4/13 : ENV MD5_CHECKSUM 9b9ad79421a1bdad9c133e859140f3f2
 ---> Running in a31d06d39d61
 ---> de4feee6754a
Removing intermediate container a31d06d39d61
Step 5/13 : RUN apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ add     php7 php7-fpm php7-gd php7-session php7-xml nginx supervisor curl tar
 ---> Running in 7a0177a4051c
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
(1/43) Installing ca-certificates (20161130-r0)
(2/43) Installing libssh2 (1.7.0-r0)
(3/43) Installing libcurl (7.52.1-r0)
(4/43) Installing curl (7.52.1-r0)
(5/43) Installing nginx-common (1.10.1-r1)
Executing nginx-common-1.10.1-r1.pre-install
(6/43) Installing pcre (8.38-r1)
(7/43) Installing nginx (1.10.1-r1)
(8/43) Installing php7-common (7.0.15-r0)
(9/43) Installing ncurses-terminfo-base (6.0-r7)
(10/43) Installing ncurses-terminfo (6.0-r7)
(11/43) Installing ncurses-libs (6.0-r7)
(12/43) Installing libedit (20150325.3.1-r3)
(13/43) Installing libxml2 (2.9.4-r0)
(14/43) Installing php7 (7.0.15-r0)
(15/43) Installing php7-fpm (7.0.15-r0)
(16/43) Installing libxau (1.0.8-r1)
(17/43) Installing libxdmcp (1.1.2-r1)
(18/43) Installing libxcb (1.11.1-r0)
(19/43) Installing libx11 (1.6.4-r0)
(20/43) Installing libxext (1.3.3-r1)
(21/43) Installing libice (1.0.9-r0)
(22/43) Installing libuuid (2.28-r3)
(23/43) Installing libsm (1.2.2-r0)
(24/43) Installing libxt (1.1.5-r0)
(25/43) Installing libxpm (3.5.12-r0)
(26/43) Installing libpng (1.6.21-r0)
(27/43) Installing freetype (2.6.3-r0)
(28/43) Installing libjpeg-turbo (1.4.2-r0)
(29/43) Installing libwebp (0.5.0-r0)
(30/43) Installing php7-gd (7.0.15-r0)
(31/43) Installing php7-session (7.0.15-r0)
(32/43) Installing expat (2.1.1-r2)
(33/43) Installing php7-xml (7.0.15-r0)
(34/43) Installing libbz2 (1.0.6-r5)
(35/43) Installing libffi (3.2.1-r2)
(36/43) Installing gdbm (1.11-r1)
(37/43) Installing readline (6.3.008-r4)
(38/43) Installing sqlite-libs (3.13.0-r0)
(39/43) Installing python (2.7.12-r0)
(40/43) Installing py-meld3 (1.0.2-r0)
(41/43) Installing py-setuptools (20.8.0-r0)
(42/43) Installing supervisor (3.2.0-r0)
(43/43) Installing tar (1.29-r1)
Executing busybox-1.24.2-r12.trigger
Executing ca-certificates-20161130-r0.trigger
OK: 85 MiB in 54 packages
 ---> dfbafbe3d13b
Removing intermediate container 7a0177a4051c
Step 6/13 : RUN mkdir -p /run/nginx &&     mkdir -p /var/www /var/dokuwiki-storage/data &&     cd /var/www &&     curl -O -L "https://download.dokuwiki.org/src/dokuwiki/dokuwiki-$DOKUWIKI_VERSION.tgz" &&     tar -xzf "dokuwiki-$DOKUWIKI_VERSION.tgz" --strip 1 &&     rm "dokuwiki-$DOKUWIKI_VERSION.tgz" &&     mv /var/www/data/pages /var/dokuwiki-storage/data/pages &&     ln -s /var/dokuwiki-storage/data/pages /var/www/data/pages &&     mv /var/www/data/meta /var/dokuwiki-storage/data/meta &&     ln -s /var/dokuwiki-storage/data/meta /var/www/data/meta &&     mv /var/www/data/media /var/dokuwiki-storage/data/media &&     ln -s /var/dokuwiki-storage/data/media /var/www/data/media &&     mv /var/www/data/media_attic /var/dokuwiki-storage/data/media_attic &&     ln -s /var/dokuwiki-storage/data/media_attic /var/www/data/media_attic &&     mv /var/www/data/media_meta /var/dokuwiki-storage/data/media_meta &&     ln -s /var/dokuwiki-storage/data/media_meta /var/www/data/media_meta &&     mv /var/www/data/attic /var/dokuwiki-storage/data/attic &&     ln -s /var/dokuwiki-storage/data/attic /var/www/data/attic &&     mv /var/www/conf /var/dokuwiki-storage/conf &&     ln -s /var/dokuwiki-storage/conf /var/www/conf
 ---> Running in 055ce9b53965
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed                                                                                  
100 3382k  100 3382k    0     0   866k      0  0:00:03  0:00:03 --:--:--  874k                                                                                 
 ---> c69129789ec5
Removing intermediate container 055ce9b53965
Step 7/13 : ADD nginx.conf /etc/nginx/nginx.conf
 ---> c029139da6ee
Removing intermediate container 1edb3dcf93d0
Step 8/13 : ADD supervisord.conf /etc/supervisord.conf
 ---> bc2f0ee24904
Removing intermediate container 0155b7c33d0e
Step 9/13 : ADD start.sh /start.sh
 ---> de93cd1dc32d
Removing intermediate container b76a321ab787
Step 10/13 : RUN echo "cgi.fix_pathinfo = 0;" >> /etc/php7/php-fpm.ini &&     sed -i -e "s|;daemonize\s*=\s*yes|daemonize = no|g" /etc/php7/php-fpm.conf &&     sed -i -e "s|listen\s*=\s*127\.0\.0\.1:9000|listen = /var/run/php-fpm7.sock|g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.owner\s*=\s*|listen.owner = |g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.group\s*=\s*|listen.group = |g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.mode\s*=\s*|listen.mode = |g" /etc/php7/php-fpm.d/www.conf &&     chmod +x /start.sh
 ---> Running in cc12b0926659
 ---> a35e18316bc5
Removing intermediate container cc12b0926659
Step 11/13 : EXPOSE 80
 ---> Running in b5826a0c61f5
 ---> e167551370d0
Removing intermediate container b5826a0c61f5
Step 12/13 : VOLUME /var/dokuwiki-storage
 ---> Running in 69fd65c0d524
 ---> 4f99e07f4604
Removing intermediate container 69fd65c0d524
Step 13/13 : CMD /start.sh
 ---> Running in ecc50ea7bec5
 ---> 783c943c902f
Removing intermediate container ecc50ea7bec5
Successfully built 783c943c902f

Zu Testzwecken bauen wir das Image gleich ein zweites Mal.

docker build -t dokuwiki-ssl .


mig@wz:~/docker-dokuwiki$ docker build . -t dokuwiki-ssl
Sending build context to Docker daemon 83.46 kB
Step 1/13 : FROM alpine:3.4
 ---> 0766572b4bac
Step 2/13 : MAINTAINER Ilya Stepanov <dev@ilyastepanov.com>
 ---> Using cache
 ---> aec3a09b97bf
Step 3/13 : ENV DOKUWIKI_VERSION 2016-06-26a
 ---> Using cache
 ---> 3f6f89ac4bcb
Step 4/13 : ENV MD5_CHECKSUM 9b9ad79421a1bdad9c133e859140f3f2
 ---> Using cache
 ---> de4feee6754a
Step 5/13 : RUN apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ add     php7 php7-fpm php7-gd php7-session php7-xml nginx supervisor curl tar
 ---> Using cache
 ---> dfbafbe3d13b
Step 6/13 : RUN mkdir -p /run/nginx &&     mkdir -p /var/www /var/dokuwiki-storage/data &&     cd /var/www &&     curl -O -L "https://download.dokuwiki.org/src/dokuwiki/dokuwiki-$DOKUWIKI_VERSION.tgz" &&     tar -xzf "dokuwiki-$DOKUWIKI_VERSION.tgz" --strip 1 &&     rm "dokuwiki-$DOKUWIKI_VERSION.tgz" &&     mv /var/www/data/pages /var/dokuwiki-storage/data/pages &&     ln -s /var/dokuwiki-storage/data/pages /var/www/data/pages &&     mv /var/www/data/meta /var/dokuwiki-storage/data/meta &&     ln -s /var/dokuwiki-storage/data/meta /var/www/data/meta &&     mv /var/www/data/media /var/dokuwiki-storage/data/media &&     ln -s /var/dokuwiki-storage/data/media /var/www/data/media &&     mv /var/www/data/media_attic /var/dokuwiki-storage/data/media_attic &&     ln -s /var/dokuwiki-storage/data/media_attic /var/www/data/media_attic &&     mv /var/www/data/media_meta /var/dokuwiki-storage/data/media_meta &&     ln -s /var/dokuwiki-storage/data/media_meta /var/www/data/media_meta &&     mv /var/www/data/attic /var/dokuwiki-storage/data/attic &&     ln -s /var/dokuwiki-storage/data/attic /var/www/data/attic &&     mv /var/www/conf /var/dokuwiki-storage/conf &&     ln -s /var/dokuwiki-storage/conf /var/www/conf
 ---> Using cache
 ---> c69129789ec5
Step 7/13 : ADD nginx.conf /etc/nginx/nginx.conf
 ---> Using cache
 ---> c029139da6ee
Step 8/13 : ADD supervisord.conf /etc/supervisord.conf
 ---> Using cache
 ---> bc2f0ee24904
Step 9/13 : ADD start.sh /start.sh
 ---> Using cache
 ---> de93cd1dc32d
Step 10/13 : RUN echo "cgi.fix_pathinfo = 0;" >> /etc/php7/php-fpm.ini &&     sed -i -e "s|;daemonize\s*=\s*yes|daemonize = no|g" /etc/php7/php-fpm.conf &&     sed -i -e "s|listen\s*=\s*127\.0\.0\.1:9000|listen = /var/run/php-fpm7.sock|g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.owner\s*=\s*|listen.owner = |g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.group\s*=\s*|listen.group = |g" /etc/php7/php-fpm.d/www.conf &&     sed -i -e "s|;listen\.mode\s*=\s*|listen.mode = |g" /etc/php7/php-fpm.d/www.conf &&     chmod +x /start.sh
 ---> Using cache
 ---> a35e18316bc5
Step 11/13 : EXPOSE 80
 ---> Using cache
 ---> e167551370d0
Step 12/13 : VOLUME /var/dokuwiki-storage
 ---> Using cache
 ---> 4f99e07f4604
Step 13/13 : CMD /start.sh
 ---> Using cache
 ---> 783c943c902f
Successfully built 783c943c902f

Wie man an den Zeilen

 ---> Using cache

erkennen kann benutzt docker seinen Caching Mechanismus und führt daher die Schritte nicht erneut aus.

Buildprozess und Caching

Manchmal ist es jedoch nötig ein Image zu löschen (auch aus dem Cache) um den Build-Prozess erneut zu starten.
Vorallen wenn beim Erstellen des dockerfiles einige Richtlinien (zb. zusammenhängende Befehlsketten) nicht eingehalten wurden.
Dazu wieder ein lesenswerter Artikel zu Dockerfile best Practices

Löschen des Images


docker rmi dukuwiki-ssl

Build des Images ohne cache


docker build --no-cache . -t dokuwiki-ssl

Bei häufigen builds bleiben immer einige images im cache zurück.
Mittels folgender Befehle kann man sich hier einen Überblick verschaffen und aufräumen.


#Anzeigen der erstellten Container|Images|Volumes
docker ps -a
docker images
docker volumes

#löschen der erstellten Container|Images
docker rm "name oder ContainerID"
docker rmi "name oder ImageID"

#löschen von orphaned Volumes (ab Docker v1.9) frühere versionen siehe Linkliste
docker volume ls -qf dangling=true | xargs -r docker volume rm

Alternativ gibt es dazu mit Portainer einen sehr nützlichen Docker Container.

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

weitere Infos dazu in einen eigenen Artikel

Änderungen am Dockerfile

Beheben des Fehlers beim installieren von Plugins

Wie hier beschrieben gibt es Probleme beim downloaden von Plugins.
Die Änderungen des Users am Dockerfile führen aber nur dazu das das Image nicht baut, da libressl2.4-libssl aus dem main-repositorium fehlt
die korrekte RUN Zeile lautet:

RUN apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main/ add \
libressl2.4-libssl && \
apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ add \
php7 php7-fpm php7-gd php7-session php7-zlib php7-openssl php7-xml nginx supervisor curl tar

Überprüfen des Downloads mittels md5sum

folgendes direkt nach der CURL-Zeile einfügen

echo "$MD5_CHECKSUM dokuwiki-$DOKUWIKI_VERSION.tgz" > dokuwiki-$DOKUWIKI_VERSION.tgz.md5 && \
md5sum -c dokuwiki-$DOKUWIKI_VERSION.tgz.md5 && \

Ermöglichen eine Backups der zusätzlich installierten Plugins

Hier erstellen wir einfach ein zusätzliches Volume für den „lib/plugins“ Ordner

VOLUME ["/var/www/lib/plugins"]

Automatisiertes Backup

Ein simple Backup per Cronjob innerhalb der docker Instanz.
Das Shellscript wird als backup im gleichen Ordner wie das Dockerfile abgelegt
Das script wird dann vom Dockerfile nach /etc/periodic/daily kopiert.
Dieses Verzeichnis wird via run-parts vom crond ausgeführt, daher sollte es keine Dateinamenerweiterung haben da es run-parts sonst ignoriert. Siehe auch das corntab-file in Alpine-linux

crontab -l
# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly
#!/bin/sh
 
backup_files="/var/dokuwiki-storage"
 
dest="/var/backup"
 
day=$(date +%A)

archive_file="$day.tgz"
 
tar czf $dest/$archive_file $backup_files

Folgende Zeilen werden ins Dockerfile eingtragen

ADD backup.sh /etc/periodic/daily/backup.sh
#in der ersten RUN Zeile nach dem ersten mkdir kommando
mkdir -p /var/www /var/dokuwiki-backup && \

#zusätzlich in der letzten RUN-Zeile
chmod +x /etc/periodic/daily/backup

#Und ein Volume um die Backups simpel per "docker cp" wegkopieren zu können.
VOLUME ["/var/dokuwiki-backup"]

#zuletzt zum starten von crond folgende Zeilen in die superviserd.conf
[program:crond]
command=/usr/sbin/crond

Das vollständig geänderte Dockerfile

FROM alpine:3.4
LABEL maintainer mig@aon.at

ENV DOKUWIKI_VERSION 2016-06-26a
ENV MD5_CHECKSUM 9b9ad79421a1bdad9c133e859140f3f2

RUN apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main/ add \
libressl2.4-libssl && \
apk --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ add \
php7 php7-fpm php7-gd php7-session php7-zlib php7-openssl php7-xml nginx supervisor curl tar

RUN mkdir -p /run/nginx && \
mkdir -p /var/www /var/dokuwiki-storage/data && \
mkdir -p /var/www /var/dokuwiki-backup && \
cd /var/www && \
curl -O -L "https://download.dokuwiki.org/src/dokuwiki/dokuwiki-$DOKUWIKI_VERSION.tgz" && \
echo "$MD5_CHECKSUM dokuwiki-$DOKUWIKI_VERSION.tgz" > dokuwiki-$DOKUWIKI_VERSION.tgz.md5 && \
md5sum -c dokuwiki-$DOKUWIKI_VERSION.tgz.md5 && \
tar -xzf "dokuwiki-$DOKUWIKI_VERSION.tgz" --strip 1 && \
rm "dokuwiki-$DOKUWIKI_VERSION.tgz" && \
mv /var/www/data/pages /var/dokuwiki-storage/data/pages && \
ln -s /var/dokuwiki-storage/data/pages /var/www/data/pages && \
mv /var/www/data/meta /var/dokuwiki-storage/data/meta && \
ln -s /var/dokuwiki-storage/data/meta /var/www/data/meta && \
mv /var/www/data/media /var/dokuwiki-storage/data/media && \
ln -s /var/dokuwiki-storage/data/media /var/www/data/media && \
mv /var/www/data/media_attic /var/dokuwiki-storage/data/media_attic && \
ln -s /var/dokuwiki-storage/data/media_attic /var/www/data/media_attic && \
mv /var/www/data/media_meta /var/dokuwiki-storage/data/media_meta && \
ln -s /var/dokuwiki-storage/data/media_meta /var/www/data/media_meta && \
mv /var/www/data/attic /var/dokuwiki-storage/data/attic && \
ln -s /var/dokuwiki-storage/data/attic /var/www/data/attic && \
mv /var/www/conf /var/dokuwiki-storage/conf && \
ln -s /var/dokuwiki-storage/conf /var/www/conf

ADD nginx.conf /etc/nginx/nginx.conf
ADD supervisord.conf /etc/supervisord.conf
ADD start.sh /start.sh
ADD backup /etc/periodic/daily/backup

RUN echo "cgi.fix_pathinfo = 0;" >> /etc/php7/php-fpm.ini && \
sed -i -e "s|;daemonize\s*=\s*yes|daemonize = no|g" /etc/php7/php-fpm.conf && \
sed -i -e "s|listen\s*=\s*127\.0\.0\.1:9000|listen = /var/run/php-fpm7.sock|g" /etc/php7/php-fpm.d/www.conf && \
sed -i -e "s|;listen\.owner\s*=\s*|listen.owner = |g" /etc/php7/php-fpm.d/www.conf && \
sed -i -e "s|;listen\.group\s*=\s*|listen.group = |g" /etc/php7/php-fpm.d/www.conf && \
sed -i -e "s|;listen\.mode\s*=\s*|listen.mode = |g" /etc/php7/php-fpm.d/www.conf && \
chmod +x /start.sh && \
chmod +x /etc/periodic/daily/backup

EXPOSE 80
VOLUME /var/dokuwiki-storage /var/www/lib/plugins /var/dokuwiki-backup

CMD /start.sh


Im letzten Teile dieser Artikelserie werde ich alle Änderungen zusammanführen (incl Backup und Restore)

Fortsetzung des Artikels

docker dokuwiki Teil3
docker dokuwiki Teil1


Linkliste

Dockerfile best Practices
cleanup orphaned volumes
Portainer
Alpine Linux Package search

2 comments on docker dokuwiki Teil2

Schreibe einen Kommentar

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