Dans Dockerfiles, il y a deux commandes qui me ressemblent: CMD
et ENTRYPOINT
. Mais je suppose qu'il y a une différence (subtile?) Entre eux - sinon cela n'aurait aucun sens d'avoir deux commandes pour la même chose.
La documentation indique CMD
Le but principal d'un CMD est de fournir des valeurs par défaut pour un conteneur en cours d'exécution.
et pour ENTRYPOINT
:
Un ENTRYPOINT vous aide à configurer un conteneur que vous pouvez exécuter en tant qu'exécutable.
Alors, quelle est la différence entre ces deux commandes?
ADD
etCOPY
Réponses:
Docker a un point d'entrée par défaut qui est
/bin/sh -c
mais n'a pas de commande par défaut.Lorsque vous exécutez docker comme ceci:
docker run -i -t ubuntu bash
le point d'entrée est la valeur par défaut/bin/sh -c
, l'image estubuntu
et la commande l'estbash
.La commande est exécutée via le point d'entrée. c'est-à-dire que la chose réelle qui est exécutée est
/bin/sh -c bash
. Cela a permis à Docker de mettre en œuvreRUN
rapidement en s'appuyant sur l'analyseur du shell.Plus tard, les gens ont demandé à pouvoir le personnaliser,
ENTRYPOINT
et--entrypoint
ont été présentés.Tout ce qui suit
ubuntu
dans l'exemple ci-dessus est la commande et est passé au point d'entrée. Lorsque vous utilisez l'CMD
instruction, c'est exactement comme si vous le faisiezdocker run -i -t ubuntu <cmd>
.<cmd>
sera le paramètre du point d'entrée.Vous obtiendrez également le même résultat si vous tapez plutôt cette commande
docker run -i -t ubuntu
. Vous démarrerez toujours un shell bash dans le conteneur car le Dockerfile ubuntu a spécifié un CMD par défaut:CMD ["bash"]
Comme tout est passé au point d'entrée, vous pouvez avoir un très bon comportement à partir de vos images. L'exemple @Jiri est bon, il montre comment utiliser une image comme "binaire". Lorsque vous l'utilisez
["/bin/cat"]
comme point d'entrée et quedocker run img /etc/passwd
vous le faites , vous l'obtenez,/etc/passwd
est la commande et est passée au point d'entrée, de sorte que l'exécution du résultat final est simple/bin/cat /etc/passwd
.Un autre exemple serait d'avoir n'importe quel cli comme point d'entrée. Par exemple, si vous avez une image Redis, au lieu de courir
docker run redisimg redis -H something -u toto get key
, vous pouvez simplement avoirENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
et courir comme cela pour le même résultat:docker run redisimg get key
.la source
ENTRYPOINT
; L'utilisation d'un shell dépend de la forme utilisée de laCMD
commande ( docs.docker.com/engine/reference/builder/#cmd ).CMD
vsENTRYPOINT
.La
ENTRYPOINT
spécifie une commande qui sera toujours exécutée au démarrage du conteneur.Le
CMD
spécifie les arguments qui seront fournis auENTRYPOINT
.Si vous souhaitez créer une image dédiée à une commande spécifique, vous utiliserez
ENTRYPOINT ["/path/dedicated_command"]
Sinon, si vous souhaitez créer une image à des fins générales, vous pouvez laisser
ENTRYPOINT
non spécifié et utiliserCMD ["/path/dedicated_command"]
car vous pourrez remplacer le paramètre en fournissant des arguments àdocker run
.Par exemple, si votre Dockerfile est:
L'exécution de l'image sans aucun argument enverra une requête ping à l'hôte local:
Maintenant, l'exécution de l'image avec un argument exécutera un ping sur l'argument:
À titre de comparaison, si votre Dockerfile est:
L'exécution de l'image sans aucun argument enverra une requête ping à l'hôte local:
Mais l'exécution de l'image avec un argument exécutera l'argument:
Voir cet article de Brian DeHamer pour encore plus de détails: https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
la source
The ENTRYPOINT specifies a command that will always be executed when the container starts. The CMD specifies arguments that will be fed to the ENTRYPOINT.
est un bon résumé au point.Selon les documents Docker ,
Les tableaux ci-dessous montrent quelle commande est exécutée pour différentes
ENTRYPOINT
/CMD
combinaisons :-
No ENTRYPOINT
-
ENTRYPOINT exec_entry p1_entry
-
ENTRYPOINT [“exec_entry”, “p1_entry”]
la source
/bin/sh -c
est impliqué?/bin/sh -c
peut-être que CMD serait ajouté en tant que préfixe alors que CMD serait écrit en syntaxe exécutable (et non en syntaxe de liste).ENTRYPOINT exec_entry p1_ent
a été mal expliqué. Le formulaire shell empêche l'utilisation de tout argument CMD ou d'exécution de ligne de commande - docs.docker.com/engine/reference/builder/#entrypointOui, c'est une bonne question. Je ne le comprends pas encore tout à fait, mais:
Je comprends que
ENTRYPOINT
c'est le binaire qui est exécuté. Vous pouvez remplacer le point d'entrée par --entrypoint = "".CMD est l'argument par défaut du conteneur. Sans point d'entrée, l'argument par défaut est la commande qui est exécutée. Avec entrypoint, cmd est passé à entrypoint comme argument. Vous pouvez émuler une commande avec point d'entrée.
Ainsi, le principal avantage est qu'avec le point d'entrée, vous pouvez passer des arguments (cmd) à votre conteneur. Pour ce faire, vous devez utiliser les deux:
et
alors vous pouvez utiliser:
la source
docker run image_name -h
pour afficher des informations d'aide sur cette image.Différence entre CMD et ENTRYPOINT par intuition :
Oui, ça se mélange.
Vous pouvez remplacer l'un d'eux lors de l'exécution de Docker Run.
Différence entre CMD et ENTRYPOINT par exemple :
Plus sur la différence entre
CMD
etENTRYPOINT
:Un argument
docker run
tel que / bin / bash remplace toute commande CMD que nous avons écrite dans Dockerfile.ENTRYPOINT ne peut pas être remplacé lors de l'exécution avec des commandes normales telles que
docker run [args]
. Àargs
la fin dedocker run [args]
sont fournis comme arguments à ENTRYPOINT. De cette façon, nous pouvons créer uncontainer
qui est comme un binaire normal tel quels
.Ainsi, CMD peut agir comme paramètres par défaut pour ENTRYPOINT, puis nous pouvons remplacer les arguments CMD à partir de [args].
ENTRYPOINT peut être remplacé par
--entrypoint
.la source
En un mot:
Si vous avez besoin de plus de détails ou souhaitez voir une différence sur l'exemple, il y a un article de blog qui compare de manière complète CMD et ENTRYPOINT avec de nombreux exemples - http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
la source
J'ajouterai ma réponse comme exemple 1 qui pourrait vous aider à mieux comprendre la différence.
Supposons que nous voulons créer une image qui exécutera toujours une commande sleep au démarrage. Nous allons créer notre propre image et spécifier une nouvelle commande:
Maintenant, nous construisons l'image:
Et si nous voulons changer le nombre de secondes? Nous devrions changer la
Dockerfile
car la valeur y est codée en dur, ou remplacer la commande en fournissant une autre:Bien que cela fonctionne, ce n'est pas une bonne solution, car nous avons une commande redondante "sleep" (le but du conteneur est de dormir , donc avoir à spécifier explicitement la
sleep
commande n'est pas une bonne pratique).Essayons maintenant d'utiliser l'
ENTRYPOINT
instruction:Cette instruction spécifie le programme qui sera exécuté au démarrage du conteneur .
Maintenant, nous pouvons exécuter:
Et une valeur par défaut? Eh bien, vous l'avez deviné:
Le
ENTRYPOINT
est le programme qui sera exécuté, et la valeur transmise au conteneur sera rajoutée.Le
ENTRYPOINT
peut être remplacé en spécifiant un--entrypoint
indicateur, suivi du nouveau point d'entrée que vous souhaitez utiliser.Pas le mien, j'ai regardé une fois un tutoriel qui a fourni cet exemple
la source
La réponse acceptée est fabuleuse pour expliquer l'histoire. Je trouve que ce tableau l'explique très bien à partir du document officiel sur «comment CMD et ENTRYPOINT interagissent» :
la source
Commentaires sur la fonction EntryPoint dans le code
Une autre référence de documents
Exemple:
Build : sudo docker build -t ent_cmd.
.
ps: en présence d'EntréePoint, CMD conservera les arguments à transmettre à EntryPoint. En l'absence d'EntréePoint, CMD sera la commande qui sera exécutée.
la source
CMD
La commande mentionnée dans leDockerfile
fichier peut être remplacée via ladocker run
commande alors qu'elleENTRYPOINT
ne peut pas l'être.la source
docker run --help
la commande dit le contraire:--entrypoint string Overwrite the default ENTRYPOINT of the image
J'ai lu toutes les réponses et je veux résumer pour une meilleure compréhension à première vue comme suit:
Tout d'abord, la commande entière qui est exécutée dans le conteneur comprend deux parties: la commande et les arguments
Dans le livre Kubernetes In Action, il y a une note importante à ce sujet. (Chapitre 7)
Vous pouvez également lire cet article pour une grande explication d'une manière simple
la source
CMD:
CMD ["executable","param1","param2"]
:["executable","param1","param2"]
est le premier processus.CMD command param1 param2
:/bin/sh -c CMD command param1 param2
est le premier processus.CMD command param1 param2
est issu du premier processus.CMD ["param1","param2"]
: Ce formulaire est utilisé pour fournir des arguments par défaut pourENTRYPOINT
.ENTRYPOINT (la liste suivante ne prend pas en compte le cas où CMD et ENTRYPOINT sont utilisés ensemble):
ENTRYPOINT ["executable", "param1", "param2"]
:["executable", "param1", "param2"]
est le premier processus.ENTRYPOINT command param1 param2
:/bin/sh -c command param1 param2
est le premier processus.command param1 param2
est issu du premier processus.Comme l'a dit creack , CMD a été développé en premier. Ensuite, ENTRYPOINT a été développé pour plus de personnalisation. Puisqu'ils ne sont pas conçus ensemble, il existe des chevauchements de fonctionnalités entre CMD et ENTRYPOINT, ce qui confond souvent les gens.
la source
La plupart des gens l'expliquent parfaitement ici, donc je ne répéterai pas toutes les réponses. Mais pour avoir une bonne impression, je vous suggère de le tester vous-même en regardant les processus dans le conteneur.
Créez un petit Dockerfile du formulaire:
Construisez-le, exécutez-le avec
docker run -it theimage
et exécutez-leps -eo ppid,pid,args
dans le conteneur. Comparez cette sortie à la sortie que vous recevez de ps lorsque vous utilisez:docker run -it theimage bash
ENTRYPOINT /bin/bash
et l'exécuter dans les deux sensCMD ["/bin/bash"]
De cette façon, vous verrez facilement les différences entre toutes les méthodes possibles.
la source
La documentation officielle des meilleures pratiques Dockerfile explique très bien les différences. Meilleures pratiques Dockerfile
CMD:
L'instruction CMD doit être utilisée pour exécuter le logiciel contenu dans votre image, ainsi que tous les arguments. CMD devrait presque toujours être utilisé sous la forme de
CMD ["executable", "param1", "param2"…]
. Ainsi, si l'image est destinée à un service, comme Apache et Rails, vous exécutez quelque chose commeCMD ["apache2","-DFOREGROUND"]
. En effet, cette forme d'instruction est recommandée pour toute image de service.POINT D'ACCÈS:
La meilleure utilisation pour ENTRYPOINT est de définir la commande principale de l'image, permettant à cette image d'être exécutée comme s'il s'agissait de cette commande (puis d'utiliser CMD comme indicateurs par défaut).
la source