3.1 Anweisung FROM
Also, zur Erinnerung: Dockerfile ist eine Textdatei, die Anweisungen zum Erstellen eines Docker-Images enthält. Jede Anweisung in einem Dockerfile erfüllt eine bestimmte Aufgabe und erzeugt eine neue Schicht im Image. In dieser Vorlesung gehen wir genauer auf die Hauptanweisungen in Dockerfile ein: FROM, RUN, COPY und CMD, die der Schlüssel zur Erstellung von funktionalen und effizienten Docker-Images sind.
Die Anweisung FROM legt das Basisimage fest, aus dem ein neues Image erstellt wird. Das ist die erste Anweisung in jedem Dockerfile und definiert den Ausgangspunkt für die Erstellung des Images.
Syntax
FROM <image>[:<tag>] [AS <name>]
Wo:
<image>: der Name des Basisimages.<tag>: (optional) die Version des Basisimages. Standardmäßig wirdlatestverwendet.AS <name>: (optional) definiert einen Namen für diese Build-Phase (wird in Multi-Stage-Builds verwendet).
Beispiele
Nutzung eines Basisimage Ubuntu:
FROM ubuntu:20.04
Nutzung eines offiziellen Images von Node.js:
FROM node:14
Verwendung eines Multi-Stage-Builds zur Optimierung:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
In diesem Beispiel werden zwei Basisimages verwendet. Das erste (node:14) wird für den Build der Anwendung genutzt, das zweite (nginx:alpine) – für die Erstellung eines leichtgewichtigen Servers, der statische Dateien bereitstellt.
Durch die Verwendung von Multi-Stage-Builds enthält das endgültige Image nur eine minimale Menge an Dateien und Programmen (in diesem Fall Nginx und die gebauten statischen Dateien), was es leichter und schneller für den Einsatz macht.
3.2 Die RUN Anweisung
Die RUN Anweisung führt Befehle innerhalb des Containers aus und erstellt eine neue Schicht im Image. Diese Anweisung wird verwendet, um Pakete zu installieren, die Umgebung zu konfigurieren und andere Befehle auszuführen, die für die Vorbereitung des Image notwendig sind.
Syntax:
RUN <command>
Wo:
<command>: Der Befehl, der innerhalb des Containers ausgeführt wird.
Beispiele:
Pakete im Ubuntu-Image installieren:
RUN apt-get update && apt-get install -y curl git
Code kompilieren:
RUN gcc -o myapp myapp.c
Mehrere Befehle kombinieren
Um die Anzahl der Schichten zu reduzieren, die Größe des image zu minimieren und den Build-Prozess zu beschleunigen, wird empfohlen, mehrere Befehle in einer RUN-Anweisung zu kombinieren.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Die Anweisung COPY
Die Anweisung COPY kopiert Dateien und Verzeichnisse aus dem Build-Kontext in das Dateisystem des Containers. Das ist nützlich, um Quellcode, Konfigurationsdateien und andere Ressourcen in den Container zu übertragen.
Syntax:
COPY <src> <dest>
Wobei:
-
<src>: der Pfad zu den Dateien oder Verzeichnissen im Build-Kontext. <dest>: der Zielpfad im Container.
Beispiele:
Kopieren des gesamten Inhalts des aktuellen Verzeichnisses in das Arbeitsverzeichnis des Containers:
COPY . /app
Kopieren einzelner Dateien:
COPY package.json /app/package.json
COPY server.js /app/server.js
Verwendung von .dockerignore
Um unnötige Dateien vom Kopiervorgang auszuschließen, kann die Datei .dockerignore verwendet werden, die ähnlich wie .gitignore funktioniert.
node_modules
dist
*.log
3.4 Die Anweisung CMD
Die Anweisung CMD legt den Befehl fest, der beim Starten des Containers ausgeführt wird. Im Gegensatz zu RUN, das während des Build-Prozesses ausgeführt wird, wird CMD beim Starten des Containers aus dem erstellten Image ausgeführt.
Syntax:
CMD ["executable","param1","param2"]
Oder
CMD command param1 param2
Wo:
- ["executable","param1","param2"]: exec-Form, die bevorzugt wird, um eine korrekte Signalverarbeitung zu gewährleisten.
- command param1 param2:
shell-Form, die den Befehl in einer Shell ausführt.
Beispiele:
Starten einer Node.js-Anwendung:
CMD ["node", "app.js"]
Starten eines shell-Skripts:
CMD /usr/bin/myscript.sh
Unterschied zwischen CMD und ENTRYPOINT
CMD definiert den Standardbefehl, der beim Starten des Containers überschrieben werden kann. ENTRYPOINT definiert einen unveränderlichen Befehl, der immer ausgeführt wird, wenn der Container gestartet wird.
Beispiel für die Verwendung von ENTRYPOINT:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
In diesem Beispiel startet ENTRYPOINT ein Python-Skript, und CMD übergibt Argumente, die beim Starten des Containers geändert werden können.
Beispiel Dockerfile mit den wichtigsten Anweisungen
# Verwenden des Basis-Images von Node.js
FROM node:14
# Arbeitsverzeichnis festlegen
WORKDIR /app
# Kopiere die Dateien package.json und package-lock.json
COPY package*.json ./
# Installiere Abhängigkeiten
RUN npm install
# Kopiere den Anwendungsquellcode
COPY . .
# Definiere den Port, der von der Anwendung verwendet wird
EXPOSE 3000
# Definiere den Befehl, um die Anwendung zu starten
CMD ["node", "app.js"]
GO TO FULL VERSION