Ein Dockerfile ist ein Textdokument, das alle Anweisungen enthält,
die notwendig sind, um ein Docker-Image zu erstellen. In der
Docker-Architektur verwendet der Build-Prozess das Basis-Image
(angegeben mit dem FROM Befehl im Dockerfile) als read-only
(ro) Layer. Alle weiteren Anweisungen im Dockerfile, wie
RUN, COPY usw., führen zur Erstellung neuer
read-write (rw) Layer oberhalb des Basis-Layers.
Wenn der Build-Prozess abgeschlossen ist, werden diese rw-Layer zu neuen read-only (ro) Layern “eingefroren” und bilden zusammen mit dem Basis-Layer das endgültige Image. Das ermöglicht auch die Wiederverwendung von Layern zwischen verschiedenen Images und Containern, was Speicherplatz spart und die Build- und Deploy-Zeiten beschleunigt.
Beispiel:
# Verwenden eines Basis-Images
FROM ubuntu:latest
# Installation von notwendigen Paketen
RUN apt-get update && apt-get install -y nginx
# Festlegen des Arbeitsverzeichnisses
WORKDIR /var/www/html
# Kopieren von Dateien ins Image
COPY ./html .
# Ausführen eines Befehls
CMD ["nginx", "-g", "daemon off;"]Mit dem docker build Kommando wird das Dockerfile
sequentiell ausgeführt und das neue Image erstellt.
Beispiel:
docker build -t my-nginx:latest .FROM: Basis-Image festlegenRUN: Befehle ausführenCOPY und ADD: Dateien kopierenWORKDIR: Arbeitsverzeichnis festlegenCMD: Standardbefehl festlegenMit dem FROM Befehl in einem Dockerfile können Sie von
einem bestehenden Image ausgehen und weitere Anweisungen hinzufügen.
Beispiel:
FROM nginx:latest
COPY ./my-config.conf /etc/nginx/conf.d/default.confdocker tag mein-nginx-image:latest mein-nginx-image:v2Mit dem docker images oder docker image ls
Befehl können Sie alle verfügbaren Images anzeigen.
docker imagesWenn Sie docker build oder docker run mit
einem Image ausführen, das nicht lokal vorhanden ist, führt Docker
implizit einen docker pull Befehl aus, um das fehlende
Image herunterzuladen. Wenn kein Repository explizit angegeben ist, wird
standardmäßig versucht, das Image aus dem Docker Hub
(hub.docker.com) zu ziehen.
Beispiel:
docker run nginx:latestIn diesem Fall sucht Docker nach dem nginx:latest Image
auf dem lokalen System. Wenn es nicht gefunden wird, wird es automatisch
aus dem Docker Hub heruntergeladen.
Es ist wichtig zu beachten, dass Sie auch ein anderes Repository durch die Angabe der vollständigen Repository-URL verwenden können. Wenn Sie das tun, wird Docker das Image von diesem spezifischen Repository anstatt des Docker Hubs herunterladen.
| Befehl | Beschreibung | Beispiel |
|---|---|---|
FROM |
Setzt das Basis-Image | FROM ubuntu:latest |
RUN |
Führt Befehle im neuen Layer aus und speichert das Ergebnis | RUN apt-get update |
CMD |
Gibt die auszuführenden Befehle beim Start des Containers an | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT |
Legt die ausführbare Datei fest, die beim Start des Containers ausgeführt wird | ENTRYPOINT ["./app"] |
WORKDIR |
Setzt das Arbeitsverzeichnis in einem Container | WORKDIR /app |
COPY |
Kopiert Dateien oder Verzeichnisse vom Host in das Image | COPY ./html /var/www/html |
ADD |
Kopiert Dateien und kann auch URLs und tar-Archive verarbeiten | ADD https://example.com/app.tar.gz /app |
EXPOSE |
Informiert Docker, dass der Container auf spezifischen Ports lauscht | EXPOSE 8080 |
ENV |
Setzt Umgebungsvariablen | ENV MY_VAR my_value |
LABEL |
Fügt Metadaten zum Image hinzu | LABEL version="1.0" |
VOLUME |
Erstellt einen Mount-Point für externe Volumes oder andere Container | VOLUME /data |
USER |
Legt den Benutzer fest, der im Container ausgeführt wird | USER nginx |
ARG |
Definiert einen Build-Argument, das zur Build-Zeit verwendet wird | ARG VERSION=latest |
STOPSIGNAL |
Setzt das Systemaufrufsignal, das zum Stoppen des Containers verwendet wird | STOPSIGNAL SIGTERM |
HEALTHCHECK |
Überprüft den Gesundheitsstatus des Containers | HEALTHCHECK CMD curl --fail http://localhost/ || exit 1 |
SHELL |
Ändert den Standard-Shell für folgende RUN-Anweisungen | SHELL ["/bin/bash", "-c"] |
Wenn ENTRYPOINT und CMD in Kombination im
Dockerfile verwendet werden, dann können die Argumente des
CMD als Standardparameter für das im
ENTRYPOINT definierte Programm dienen. Die Werte in
CMD werden an das ausführbare Programm in
ENTRYPOINT angehängt.
Beispiel:
ENTRYPOINT ["/usr/bin/dumb-init"]
CMD ["--", "nginx", "-g", "daemon off;"]In diesem Fall würde dumb-init mit den Parametern
-- nginx -g daemon off; ausgeführt werden, wenn der
Container gestartet wird.
Wenn Sie docker run mit zusätzlichen Argumenten
ausführen, werden diese Argumente die Standardparameter im
CMD Befehl des Dockerfiles überschreiben und an das im
ENTRYPOINT festgelegte Programm angehängt.
docker run <IMAGE_ID> -- other-argsIn diesem Fall würden die other-args die
Standardparameter -- nginx -g daemon off; überschreiben.
Das endgültige Kommando wäre dann
/usr/bin/dumb-init other-args.
Ebenso kann ENTRYPOINT durch die Verwendung des
--entrypoint Flags beim docker run Befehl
überschrieben werden.
Beispiel:
docker run --entrypoint /bin/bash <IMAGE_ID>In diesem Fall wird /bin/bash anstelle des im Dockerfile
definierten ENTRYPOINT ausgeführt. Beachten Sie, dass wenn
ENTRYPOINT überschrieben wird, die Werte in
CMD nicht als Parameter verwendet werden. Eventuelle
Parameter müssen dann direkt im docker run Befehl angegeben
werden.
In einem Kubernetes Pod-Manifest können command und
args in der spec verwendet werden, um
ENTRYPOINT und CMD des Docker-Images zu
überschreiben oder zu erweitern.
Beispiel:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
command: ["/usr/bin/dumb-init"]
args: ["--", "nginx", "-g", "daemon off;"]In diesem Beispiel:
command: Überschreibt den ENTRYPOINT des
Docker-Images.args: Überschreibt den CMD des
Docker-Images.Das Ergebnis wäre ähnlich, als ob Sie den Container mit dem Befehl
docker run wie folgt gestartet hätten:
docker run my-image /usr/bin/dumb-init -- nginx -g daemon off;