Die vorhandenen Antworten decken das meiste ab, was jeder, der sich mit dieser Frage befasst, benötigen würde. Ich werde also nur einige Nischenbereiche für CMD und RUN abdecken.
CMD: Duplikate sind zulässig, aber verschwenderisch
GingerBeer macht einen wichtigen Punkt: Sie werden keine Fehler erhalten, wenn Sie mehr als eine CMD eingeben - aber es ist verschwenderisch, dies zu tun. Ich möchte mit einem Beispiel näher darauf eingehen:
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
Wenn Sie dies in ein Image einbauen und einen Container in diesem Image ausführen, wird, wie GingerBeer feststellt, nur die letzte CMD berücksichtigt. Die Ausgabe dieses Containers lautet also:
CMD ausführen 2
Ich denke, dass "CMD" eine einzelne globale Variable für das gesamte zu erstellende Image festlegt. Daher überschreiben aufeinanderfolgende "CMD" -Anweisungen einfach alle vorherigen Schreibvorgänge in diese globale Variable und in das endgültige Image, das das erstellt Der letzte, der schreibt, gewinnt. Da eine Docker-Datei in der Reihenfolge von oben nach unten ausgeführt wird, wissen wir, dass die unterste CMD diejenige ist, die dieses endgültige "Schreiben" erhält (metaphorisch gesprochen).
RUN: Befehle werden möglicherweise nicht ausgeführt, wenn Bilder zwischengespeichert werden
Ein subtiler Punkt, der bei RUN zu beachten ist, ist, dass es als reine Funktion behandelt wird, selbst wenn es Nebenwirkungen gibt, und daher zwischengespeichert wird. Dies bedeutet, dass wenn RUN einige Nebenwirkungen hatte, die das resultierende Image nicht ändern, und dieses Image bereits zwischengespeichert wurde, der RUN nicht erneut ausgeführt wird und die Nebenwirkungen bei nachfolgenden Builds nicht auftreten. Nehmen Sie zum Beispiel diese Docker-Datei:
FROM busybox
RUN echo "Just echo while you work"
Wenn Sie es zum ersten Mal ausführen, erhalten Sie eine Ausgabe wie diese mit verschiedenen alphanumerischen IDs:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest
Beachten Sie, dass die Echo-Anweisung oben ausgeführt wurde. Wenn Sie es zum zweiten Mal ausführen, wird der Cache verwendet, und in der Ausgabe des Builds wird kein Echo angezeigt:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Using cache
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest