Les réponses existantes couvrent l'essentiel de ce dont aurait besoin toute personne examinant cette question. Je vais donc couvrir quelques domaines de niche pour CMD et RUN.
CMD: les doublons sont autorisés mais inutiles
GingerBeer fait un point important: vous n'obtiendrez aucune erreur si vous mettez plus d'un CMD - mais c'est inutile de le faire. Je voudrais développer un exemple:
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
Si vous construisez cela dans une image et exécutez un conteneur dans cette image, alors, comme l'indique GingerBeer, seul le dernier CMD sera pris en compte. La sortie de ce conteneur sera donc:
Exécution de CMD 2
La façon dont je pense à cela est que "CMD" définit une seule variable globale pour l'image entière en cours de construction, donc les instructions "CMD" successives écrasent simplement toutes les écritures précédentes sur cette variable globale, et dans l'image finale qui est construite, la le dernier à écrire gagne. Puisqu'un Dockerfile s'exécute de haut en bas, nous savons que le CMD le plus bas est celui qui obtient cette "écriture" finale (métaphoriquement).
RUN: les commandes peuvent ne pas s'exécuter si les images sont mises en cache
Un point subtil à noter à propos de RUN est qu'il est traité comme une fonction pure même s'il y a des effets secondaires, et est donc mis en cache. Cela signifie que si RUN a eu des effets secondaires qui ne modifient pas l'image résultante et que cette image a déjà été mise en cache, la RUN ne sera pas exécutée à nouveau et les effets secondaires ne se produiront donc pas lors des générations suivantes. Par exemple, prenez ce Dockerfile:
FROM busybox
RUN echo "Just echo while you work"
La première fois que vous l'exécutez, vous obtiendrez une sortie comme celle-ci, avec différents ID alphanumériques:
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
Notez que l'instruction echo a été exécutée ci-dessus. La deuxième fois que vous l'exécutez, il utilise le cache et vous ne verrez aucun écho dans la sortie de la build:
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