Docker Container als App einsetzen
Docker Container als App nutzen
Docker Container werden in der Regel als Microservices eingesetzt, die Dienste wie z.B. Webserver oder Datenbanken dauerhaft zur Verfügung stellen. Nicht uninteressant kann allerdings auch die Nutzung als einfaches Programm sein. Dies ist insbesondere dann nützlich, wenn die App für den Server:
- Nicht zur Verfügung steht
- Die gewünschte Funktion nur in der neuen Version verfügbar oder behoben ist
Das einfache Beispiel sieht eine Bildbearbeitung mit GraphicsMagick vor, ist aber auch angepasst auf andere Software wie z.B. certbot und weitere anwendbar. Während auf dem Server nur ein veralteter Kandidaten für GraphicsMagick angeboten wird, könnte hier nach dem Cross-Platform Prinzip einfach die Version 1.3.28 von Ubuntu 18.04 (Bionic Beaver) verwendet werden.
Sicherheitsaspekt
Ganz konventionell könnte die aktuelle Version von GraphicsMagick auch im Quelltext heruntergeladen und für den Server kompiliert werden. Dies hat aber Nachteile:
- Muss regelmäßig und manuell gemacht werden, um Fehler bei Compilieren auszuschließen
- Dauert lange
- Entwicklungsumgebung muss auf dem Server installiert sein oder ein Spiegelserver dafür genutzt werden
- Binary muss im Anschluss noch ausgiebig getestet werden
Die auf die Dockerart eingebundene Software wurde als Binärdatei bereits gut getestet. Da sie Teil der Distribution Ubuntu 18.04 ist enthält die App beim Bauen des Images bereits alle Sicherheitsupdates von den zuständigen Maintainern. Natürlich funktioniert das Vorgehen auch mit anderen Distributionen des Vertrauens, denn bei den großen sind die Firmen und Community direkt auch an den Docker Images der Ableger beteiligt.
Inhalt Dockerfile (einfach)
FROM ubuntu:bionic
ENV DEBIAN_FRONTEND noninteractive
ENV TERM linux
RUN apt-get update \
&& apt-get install -y --no-install-recommends locales graphicsmagick \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /tmp/pics
RUN locale-gen de_DE.UTF-8 \
&& locale-gen en_US.UTF-8 \
&& ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
Gebaut wird das Image mit dem Namen myapp über (Der Punkt am Ende ist wichtig):
docker build -t myapp .
Damit entsteht das Docker Image mit dem Tag myapp:latest. Geplant ist die Nutzung als Container, welcher im Anschluss automatisch gelöscht wird und somit aus dem Speicher verschwindet. Auch ist die Nutzung des Containers als eigener Nutzer wichtig, um den Eigentümer des Resultats nicht zwingenderweise zu root:root werden zu lassen.
Um die Nutzung so einfach wie möglich zu machen ist eine Einbindung der App in die Liste der bekannten Programme möglich. Das gelingt für den aktuellen Nutzer über einen Eintrag in der Konfigurationsdatei ~/.bashrc
nano ~/.bashrc
Hier muss folgende Zeile hinzugefügt werden:
app () { docker run --rm -ti -u $(id -u):$(id -g) -v "$(pwd)":/tmp/pics myapp $1; }
Erläuterung der Parameter
app (): Name der angelegten Funktion. Falls der Name sich hier mit einem bestehenden Programmnamen oder Symlink deckt würde dieser vom System favorisiert werden. Info: Der Befehl 'which' zeigt keine alias und Functions aus der .bashrc an.
--rm: Der Container soll temporär mit generischem Namen gestartet und im Anschluss wieder vom System entfernt werden. Das Image myapp bleibt für den nächsten Einsatz erhalten.
-ti: Pseudo-TTY mit stdin Verbindung.
-u: Mit dem Befehl 'id' werden die Bilder als ausführender User auf dem Server gespeichert und nicht zwingenderweise als root (Standardwert).
-v: Den Ordner nutzen in dem man sich gerade befindet, also der working directory.
Ein Aus- und Einloggen ist für das Anwenden der Änderung nicht nötig beim Aufruf von (ersten Punkt beachten):
. ~/.bashrc
Nun kann der Befehl als Programmaufruf verwendet werden, um die Dateien in dem aktuellen Verzeichnis zu bearbeiten und das Ergebnis dorthin zu speichern. Auch Unterordner sind erreichbar. In diesem Beispiel wird der Gammawert des Bildes mit dem Namen in.png erhöht und als out.png gespeichert.
app "gm convert in.png -gamma 1.5 out.png"
Wenn ihr Fragen habt, meldet euch: info@mobilistics.de