Docker/Images selbst definieren
Images selbst definieren
FROM debian:stable-slim
ARG USERNAME=pandoc
ARG USER_UID=1000
ARG USER_GID=1000
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils bash wget make graphviz biber \
texlive-base texlive-plain-generic texlive-latex-base \
#
&& groupadd --gid $USER_GID $USERNAME \
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
#
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
WORKDIR /pandoc
USER $USERNAME
docker build -t <NAME> -f <DOCKERFILE> .
FROM gibt die Basis an, d. h. hier ein Image von Debian in der Variante stable-slim, d. h. das ist der Basis-Layer für das zu bauende Docker-Image
Über ARG werden hier Variablen gesetzt
RUN ist der Befehl, der im Image (hier Debian) ausgeführt wird und einen neuen Layer hinzufügt
- In diesen Layer werden alle Dateien eingefügt, die bei der Ausführung des Befehls erzeugt oder angelegt werden
- Hier im Beispiel wird das Debian-Tool
apt-getgestartet und weitere Debian-Pakete installiert
Da jeder RUN-Befehl einen neuen Layer anlegt, werden die restlichen Konfigurationen ebenfalls in diesem Lauf durchgeführt
- Insbesondere wird ein nicht-Root-User angelegt, der von der UID und GID dem Default-User in Linux entspricht
- Die gemounteten Dateien haben die selben Rechte wie auf dem Host, und durch die Übereinstimmung von UID/GID sind die Dateien problemlos zugreifbar und man muss nicht mit dem Root-User arbeiten (dies wird aus offensichtlichen Gründen als Anti-Pattern angesehen)
- Bevor der
RUN-Lauf abgeschlossen wird, werden alle temporären und später nicht benötigten Dateien vonapt-getentfernt, damit diese nicht Bestandteil des Layers werden
Mit WORKDIR und USER wird das Arbeitsverzeichnis gesetzt und auf den angegebenen User umgeschaltet
- Damit muss der User nicht mehr beim Aufruf von außen gesetzt werden
Über docker build -t <NAME> -f <DOCKERFILE> . wird aus dem angegebenen Dockerfile und dem Inhalt des aktuellen Ordners (".") ein neues Image erzeugt und mit dem angegebenen Namen benannt
Hinweis zum Umgang mit Containern und Updates: Bei der Erstellung eines Images sind bestimmte Softwareversionen Teil des Images geworden
- Man kann prinzipiell in einem Container die Software aktualisieren, aber dies geht in dem Moment wieder verloren, wo der Container beendet und gelöscht wird
- Außerdem widerspricht dies dem Gedanken, dass mehrere Personen mit dem selben Image/Container arbeiten und damit auch die selben Versionsstände haben
- In der Praxis löscht man deshalb das alte Image einfach und erstellt ein neues, welches dann die aktualisierte Software enthält