Je ne sais pas quand utiliser CMD vs RUN. Par exemple, pour exécuter des commandes bash / shell (c'est-à-dire ls -la
), j'utilise toujours CMD ou existe-t-il un cas où j'utiliserais RUN? Essayer de comprendre les meilleures pratiques concernant ces deux directives Dockerfile similaires.
Réponses
Trop de publicités?COURIR est une image de l'étape de génération, l'état du conteneur après un RUN
commande sera engagée à l'image docker. Un Dockerfile peut avoir de nombreux RUN
étapes que la couche au-dessus de l'autre pour construire l'image.
CMD est la commande le conteneur s'exécute par défaut lorsque vous lancez le construit de l'image. Un Dockerfile ne peut avoir qu'un CMD
. L' CMD
peut être remplacée lors du démarrage d'un récipient avec de l' docker run $image $other_command
.
Point d'entrée est également étroitement lié à d' CMD
et peuvent modifier la façon dont un conteneur commence une image.
J'ai trouvé cet article très utile de comprendre la différence entre eux:
EXÉCUTEZ- EXÉCUTEZ l'instruction permet d'installer votre application et les paquets requise pour cela. Il exécute toutes les commandes sur le haut de l'image et crée un nouveau calque par commettre les résultats. Souvent, vous trouverez plusieurs EXÉCUTER des instructions dans un Dockerfile.
CMD-
CMD instruction permet de définir une valeur par défaut de la commande, qui sera
exécuté uniquement lorsque vous exécutez conteneur sans spécification d'une commande.
Si Docker conteneur s'exécute avec une commande, la commande par défaut sera
ignoré. Si Dockerfile a plus d'un CMD instruction, toutes les mais la dernière
CMD instructions sont ignorées.
EXÉCUTER:
L'
RUN
instruction, l'exécution de toute commande dans un nouveau calque au-dessus de l'actuel de l'image, et de s'engager sur cette image. L'image ainsi engagé sera utilisé pour la prochaine l'instruction dans le Dockerfile.L'
RUN
instruction a deux formes:
- L'
RUN <command>
formulaire- L'
RUN ["executable", "arg1", "arg2"...]
formulaireDans la première forme, l'exécution de la commande dans un shell, plus précisément l'
/bin/sh -c <command>
shell. La deuxième forme est utile dans les cas où l'image de base n'ont pas d'/bin/sh
shell. Docker utilise un cache pour ces images s'appuie. Ainsi, dans le cas où votre image de l'échec de la construction, quelque part dans le milieu de la prochaine exécution de réutilisation précédemment réussite partielle construit et continuer à partir du point où il a échoué.NOTE
Le cache sera invalidé dans ces situations:
- Lorsque le panneau de construire de commande est exécuté avec l'
--no-cache
drapeau.- En cas de non-cacheable commande telle que
apt-get
mise à jour est donnée. Tous EXÉCUTION suivant les instructions sera exécuté à nouveau.- Lors de la première rencontrés
ADD
instruction invalide le cache pour toutes les instructions suivantes dans le Dockerfile si le contenu de l' le contexte a changé. Cela aura également pour effet d'invalider le cache pour l'RUN
les instructions.CMD:
L'
CMD
instruction fournit la commande par défaut pour un conteneur à exécuter. Il a les formes suivantes:
- L'
CMD ["executable", "arg1", "arg2"...]
formulaire- L'
CMD ["arg1", "arg2"...]
formulaire- L'
CMD command arg1 arg2
...-La première forme est comme un
exec
et c'est la forme préférée, dans lequel la première valeur est le chemin vers l'exécutable et est suivie par les arguments.-La deuxième forme omet l'exécutable, mais nécessite l'
ENTRYPOINT
d'instruction pour spécifier le fichier exécutable.-Si vous utilisez la forme de la coquille de l'
CMD
enseignement, alors l'<command>
commande sera exécutée dans l'/bin/sh -c
shell.NOTE:
Si l'utilisateur fournit une commande dans un menu fixe exécuter, il remplace le
CMD
commande.RÉSUMÉ
La différence entre le
RUN
etCMD
instructions est qu'unRUN
instruction exécute la commande et s'engage, alors que l'CMD
instruction n'est pas exécutée pendant la construction. C'est un défaut de la commande à exécuter lorsque l'utilisateur démarre un conteneur, à moins que l'utilisateur fournit une commande à lancer.