Contents
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