Docker Dockerfile
Was ist ein Dockerfile?
Ein Dockerfile ist eine Textdatei, die alle Anweisungen zum Erstellen eines Docker-Images enthält.
Das Dockerfile ist eine Textdatei, die zum Erstellen eines Images verwendet wird. Sein Textinhalt enthält die Anweisungen und Erklärungen, die zum Erstellen des Images erforderlich sind.
Durch die Definition einer Reihe von Befehlen und Parametern leitet das Dockerfile Docker beim Erstellen eines benutzerdefinierten Images an.
Verwenden von Dockerfile zum Anpassen von Images
Hier erklären wir nur, wie man eine Dockerfile-Datei ausführt, um ein Image anzupassen. Die detaillierte Erklärung der Anweisungen im Dockerfile wird im nächsten Abschnitt vorgestellt. Hier müssen Sie nur den Build-Prozess verstehen.
1. Im Folgenden passen wir ein nginx-Image an (das erstellte Image enthält eine Datei /usr/share/nginx/html/index.html)
Erstellen Sie in einem leeren Verzeichnis eine neue Datei mit dem Namen Dockerfile und fügen Sie der Datei den folgenden Inhalt hinzu:
FROM nginx RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

2. Die Rolle der FROM- und RUN-Anweisungen
FROM: Benutzerdefinierte Images basieren alle auf dem FROM-Image. Hier ist nginx das für die Anpassung erforderliche Basis-Image. Alle nachfolgenden Operationen basieren auf nginx.
RUN: Wird verwendet, um den folgenden Kommandozeilenbefehl auszuführen. Es hat die folgenden zwei Formate:
Shell-Format:
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。
exec-Format:
RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
Hinweis: Jedes Mal, wenn eine Anweisung im Dockerfile ausgeführt wird, wird ein neuer Layer auf Docker erstellt. Daher führen zu viele bedeutungslose Layer dazu, dass das Image zu groß wird. Zum Beispiel:
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
Die obige Ausführung erzeugt ein 3-Schichten-Image. Sie kann auf das folgende Format vereinfacht werden:
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
Wie oben, verwenden Sie&&Verwenden Sie "&&", um Befehle zu verbinden, sodass nach der Ausführung nur eine Image-Ebene erstellt wird.
Beginnen Sie mit dem Erstellen des Images
Führen Sie im Verzeichnis, in dem sich die Dockerfile-Datei befindet, die Build-Aktion aus.
Das folgende Beispiel erstellt ein nginx:v3 (Image-Name:Image-Tag) über das Dockerfile im Verzeichnis.
Hinweis: Das letzte.repräsentiert den Kontextpfad für diese Ausführung, der im nächsten Abschnitt vorgestellt wird.

Die obige Anzeige zeigt an, dass der Build erfolgreich war.
Kontextpfad
Im vorherigen Abschnitt wurde erwähnt, dass der letzte Teil des Befehls.der Kontextpfad ist. Was ist also der Kontextpfad?
Der Kontextpfad bedeutet, dass Docker beim Erstellen eines Images manchmal Dateien vom lokalen Rechner verwenden möchte (zum Beispiel zum Kopieren). Nachdem der Befehl docker build diesen Pfad kennt, packt er alle Inhalte unter diesem Pfad zusammen.
Analyse: Da der Betriebsmodus von Docker C/S ist. Unser lokaler Rechner ist C und die Docker-Engine ist S. Der eigentliche Build-Prozess wird unter der Docker-Engine abgeschlossen, daher können die Dateien auf unserem lokalen Rechner zu diesem Zeitpunkt nicht verwendet werden. Dazu müssen die Dateien im angegebenen Verzeichnis auf unserem lokalen Rechner verpackt und der Docker-Engine zur Verwendung bereitgestellt werden.
Wenn der letzte Parameter nicht angegeben wird, ist der Standardkontextpfad der Speicherort, an dem sich das Dockerfile befindet.
Hinweis: Platzieren Sie keine unnötigen Dateien im Kontextpfad, da sie zusammen verpackt und an die Docker-Engine gesendet werden. Wenn es zu viele Dateien gibt, wird der Prozess langsam.
Details zu den Anweisungen
| Dockerfile-Anweisungen | Beschreibung |
|---|---|
| FROM | Gibt das Basis-Image für den Aufbau nachfolgender Anweisungen an. |
| MAINTAINER | Gibt den Autor/Maintainer des Dockerfile an. (Veraltet, es wird empfohlen, die LABEL-Anweisung zu verwenden) |
| LABEL | Fügt dem Image Metadaten mithilfe von Schlüssel-Wert-Paaren hinzu. |
| RUN | Führt Befehle im Image während des Build-Prozesses aus. |
| CMD | Gibt den Standardbefehl an, wenn der Container erstellt wird. (Kann überschrieben werden) |
| ENTRYPOINT | Legt den Hauptbefehl fest, wenn der Container erstellt wird. (Kann nicht überschrieben werden) |
| EXPOSE | Deklariert die spezifischen Netzwerkports, auf denen der Container zur Laufzeit lauscht. |
| ENV | Legt Umgebungsvariablen im Container fest. |
| ADD | Kopiert Dateien, Verzeichnisse oder Remote-URLs in das Image. |
| COPY | Kopiert Dateien oder Verzeichnisse in das Image. |
| VOLUME | Erstellt Einhängepunkte für den Container oder deklariert Volumes. |
| WORKDIR | Legt das Arbeitsverzeichnis für nachfolgende Anweisungen fest. |
| USER | Gibt den Benutzerkontext für nachfolgende Anweisungen an. |
| ARG | Definiert Variablen, die während des Build-Prozesses an den Builder übergeben werden und mit dem Befehl "docker build" festgelegt werden können. |
| ONBUILD | Fügt Trigger hinzu, wenn dieses Image als Basis für einen anderen Build-Prozess verwendet wird. |
| STOPSIGNAL | Legt das Systemaufrufsignal fest, das an den Container gesendet wird, um ihn zu beenden. |
| HEALTHCHECK | Definiert einen Befehl, um den Gesundheitsstatus des Containers regelmäßig zu überprüfen. |
| SHELL | Überschreibt die Standard-Shell in Docker, die für RUN-, CMD- und ENTRYPOINT-Anweisungen verwendet wird. |
COPY
COPY-Anweisung, kopiert Dateien oder Verzeichnisse aus dem Kontextverzeichnis in den angegebenen Pfad im Container.
Format:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]:Optionaler Parameter, ändert den Eigentümer und die Gruppe der in den Container kopierten Dateien.
<source path>:Quelldatei oder Quellverzeichnis, kann hier ein Wildcard-Ausdruck sein. Seine Wildcard-Regeln müssen den filepath.Match-Regeln von Go entsprechen. Zum Beispiel:
COPY hom* /mydir/ COPY hom?.txt /mydir/
<target path>: Der angegebene Pfad im Container. Dieser Pfad muss nicht im Voraus erstellt werden; falls er nicht existiert, wird er automatisch erstellt.
ADD
Das Verwendungsformat der ADD-Anweisung ähnelt dem von COPY (unter denselben Anforderungen wird offiziell empfohlen, COPY zu verwenden). Die Funktionen sind ebenfalls ähnlich, die Unterschiede sind wie folgt:
- Vorteile von ADD: Wenn die <source file> eine tar-komprimierte Datei ist und das Komprimierungsformat gzip, bzip2 oder xz ist, wird sie automatisch in den <destination path> kopiert und entpackt.
- Nachteile von ADD: Es kann tar-komprimierte Dateien nicht kopieren, ohne sie zu entpacken. Es macht den Image-Build-Cache ungültig, was den Image-Build relativ langsam machen kann. Ob es verwendet werden sollte, kann danach entschieden werden, ob automatisches Entpacken benötigt wird.
CMD
Ähnlich der RUN-Anweisung wird sie zum Ausführen von Programmen verwendet, aber die beiden laufen zu unterschiedlichen Zeitpunkten:
- CMD wird während docker run ausgeführt.
- RUN wird während docker build ausgeführt.
Funktion: Gibt das Standardprogramm an, das für den gestarteten Container ausgeführt werden soll. Wenn das Programm die Ausführung beendet, endet auch der Container. Das durch die CMD-Anweisung angegebene Programm kann durch das Programm überschrieben werden, das in den docker run-Kommandozeilenparametern angegeben ist.
Hinweis: Wenn mehrere CMD-Anweisungen im Dockerfile vorhanden sind, wird nur die letzte wirksam.
Format:
CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
Das zweite Format wird empfohlen, da der Ausführungsprozess relativ klar ist. In der Praxis wird das erste Format auch automatisch in das zweite Format umgewandelt, und die standardmäßig ausführbare Datei ist sh.
ENTRYPOINT
Ähnlich der CMD-Anweisung, aber sie wird nicht durch den Befehl überschrieben, der durch die docker run-Kommandozeilenargumente angegeben wird. Darüber hinaus werden diese Kommandozeilenargumente als Parameter an das durch die ENTRYPOINT-Anweisung angegebene Programm übergeben.
Wenn jedoch beim Ausführen von docker run die Option --entrypoint verwendet wird, überschreibt sie das durch die ENTRYPOINT-Anweisung angegebene Programm.
Vorteile:Bei der Ausführung von docker run können Sie die für die Ausführung von ENTRYPOINT erforderlichen Parameter angeben.
Hinweis: Wenn es mehrere ENTRYPOINT-Anweisungen im Dockerfile gibt, wirkt nur die letzte.
Format:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
Es kann zusammen mit dem CMD-Befehl verwendet werden: Im Allgemeinen wird CMD für variable Parameter verwendet. Hier entspricht CMD dem Übergeben von Parametern an ENTRYPOINT, was im folgenden Beispiel erwähnt wird.
Beispiel:
Angenommen, das Image nginx:test wurde aus dem Dockerfile erstellt:
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
1. Ohne Übergabe von Parametern ausführen
$ docker run nginx:test
Der Container führt standardmäßig den folgenden Befehl aus, um den Hauptprozess zu starten.
nginx -c /etc/nginx/nginx.conf
2. Mit Parametern ausführen
$ docker run nginx:test -c /etc/nginx/new.conf
Der Container führt standardmäßig den folgenden Befehl aus, um den Hauptprozess zu starten (/etc/nginx/new.conf: Angenommen, diese Datei existiert bereits im Container).
nginx -c /etc/nginx/new.conf
ENV
Umgebungsvariablen festlegen. Sobald eine Umgebungsvariable definiert ist, kann sie in nachfolgenden Anweisungen verwendet werden.
Format:
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
Das folgende Beispiel setzt NODE_VERSION = 7.2.0, worauf in nachfolgenden Anweisungen über $NODE_VERSION verwiesen werden kann:
ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG
Build-Parameter, mit derselben Wirkung wie ENV. Der Geltungsbereich ist jedoch unterschiedlich. Die durch ARG gesetzten Umgebungsvariablen sind nur innerhalb des Dockerfile gültig, das heißt nur während des docker build-Prozesses. Diese Umgebungsvariable existiert nicht im erstellten Image.
Im Build-Befehl `docker build` kann es mit `--build-arg <parameter-name>=<value>` überschrieben werden.
Format:
ARG <参数名>[=<默认值>]
VOLUME
Definiert ein anonymes Datenvolume. Wenn Sie beim Starten des Containers vergessen, ein Datenvolume einzubinden, wird automatisch das anonyme Volume eingebunden.
Funktion:
- Verhindert den Verlust wichtiger Daten durch Container-Neustarts, was äußerst kritisch ist.
- Verhindert, dass der Container immer größer wird.
Format:
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径>
Beim Starten des Containers mit docker run können wir den Mountpunkt mithilfe des Parameters -v ändern.
EXPOSE
Deklariert nur Ports.
Funktion:
- Hilft Nutzern des Images, den Daemon-Port dieses Image-Dienstes zu verstehen, wodurch die Konfiguration des Mappings erleichtert wird.
- Bei Verwendung der zufälligen Portzuordnung zur Laufzeit, also docker run -P, werden die durch EXPOSE freigegebenen Ports automatisch zufällig zugeordnet.
Format:
EXPOSE <端口1> [<端口2>...]
WORKDIR
Gibt das Arbeitsverzeichnis an. Das mit WORKDIR angegebene Arbeitsverzeichnis ist in jeder Schicht des Image-Builds vorhanden. Das aktuelle Verzeichnis für nachfolgende Schichten wird auf das angegebene Verzeichnis geändert. Wenn das Verzeichnis nicht existiert, erstellt WORKDIR es für Sie.
Während des docker build-Prozesses erzeugt jeder RUN-Befehl eine neue Schicht. Nur Verzeichnisse, die durch WORKDIR erstellt wurden, bleiben immer erhalten.
Format:
WORKDIR <工作目录路径>
USER
Wird verwendet, um den Benutzer und die Benutzergruppe für die Ausführung nachfolgender Befehle anzugeben. Hier wird nur der Benutzer für die Ausführung nachfolgender Befehle gewechselt (Benutzer und Benutzergruppe müssen bereits im Voraus existieren).
Format:
USER <用户名>[:<用户组>]
HEALTHCHECK
Wird verwendet, um ein Programm oder eine Anweisung anzugeben, die den Ausführungsstatus des Docker-Container-Dienstes überwacht.
Format:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
ONBUILD
Wird verwendet, um die Ausführung von Build-Befehlen zu verzögern. Einfach gesagt: Befehle, die mit ONBUILD im Dockerfile angegeben wurden, werden während des aktuellen Image-Build-Prozesses nicht ausgeführt (angenommen, das Image ist test-build). Wenn ein neues Dockerfile das zuvor erstellte Image FROM test-build verwendet, dann werden beim Erstellen des Dockerfiles des neuen Images die Befehle ausgeführt, die durch ONBUILD im Dockerfile von test-build angegeben wurden.
Format:
ONBUILD <其它指令>
LABEL
Die LABEL-Anweisung wird verwendet, um dem Image einige Metadaten in Form von Schlüssel-Wert-Paaren hinzuzufügen. Die Syntax ist wie folgt:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
Zum Beispiel können wir den Autor des Images hinzufügen:
LABEL org.opencontainers.image.authors="example"Weitere Erweiterungen