CodeGym /Kurse /Docker SELF /Grundlegende Anweisungen für Dockerfile

Grundlegende Anweisungen für Dockerfile

Docker SELF
Level 13 , Lektion 2
Verfügbar

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 wird latest verwendet.
  • AS <name>: (optional) definiert einen Namen für diese Build-Phase (wird in Multi-Stage-Builds verwendet).

Beispiele

Nutzung eines Basisimage Ubuntu:

dockerfile


FROM ubuntu:20.04

Nutzung eines offiziellen Images von Node.js:

dockerfile


FROM node:14

Verwendung eines Multi-Stage-Builds zur Optimierung:

dockerfile


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:

dockerfile


RUN apt-get update && apt-get install -y curl git

Code kompilieren:

dockerfile


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.

dockerfile


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:

dockerfile


COPY . /app

Kopieren einzelner Dateien:

dockerfile


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.

Text


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:

dockerfile


CMD ["node", "app.js"]

Starten eines shell-Skripts:

dockerfile


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:

dockerfile


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

dockerfile

        
# 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"]
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION