Je suis tombé sur ceci et au début j'ai trouvé cela vraiment déroutant pour être honnête et je pense que cette confusion vient de l'utilisation du mot "CMD" parce qu'en fait ce qui va là agit comme argument . Après avoir creusé un peu, j'ai compris comment cela fonctionne. En gros :
ENTRYPOINT --> Ce que vous spécifiez ici sera la commande à exécuter au démarrage du conteneur. Si vous omettez cette définition, docker utilisera /bin/sh -c bash
pour exécuter votre conteneur.
CMD --> ce sont les arguments ajoutés à l'ENTRYPOINT sauf si l'utilisateur spécifie un argument personnalisé, c'est-à-dire docker run ubuntu <custom_cmd>
dans ce cas, au lieu d'ajouter ce qui est spécifié sur l'image dans la section CMD, docker va exécuter ENTRYPOINT <custom_cmd>
. Dans le cas où ENTRYPOINT n'a pas été spécifié, ce qui va ici sera transmis à /bin/sh -c
agissant en fait comme la commande à exécuter lors du démarrage du conteneur.
Comme tout, il est préférable d'expliquer ce qui se passe par des exemples. Disons que je crée une image docker simple en utilisant les spécifications suivantes Dockerfile :
From ubuntu
ENTRYPOINT ["sleep"]
Ensuite, je le construis en exécutant ce qui suit :
docker build . -t testimg
Cela créera un conteneur qui dormira à chaque fois que vous l'exécuterez. Donc si je l'exécute comme suit :
docker run testimg
Je vais prendre ce qui suit :
sleep: missing operand
Try 'sleep --help' for more information.
Cela se produit parce que le point d'entrée est la commande "sleep" qui a besoin d'un argument. Donc pour résoudre ce problème, je vais juste fournir la quantité de sommeil :
docker run testimg 5
Ceci s'exécutera correctement et le conteneur sera lancé, dormira 5 secondes et sortira. Comme nous pouvons le voir dans cet exemple, docker a simplement ajouté ce qui suit le nom de l'image au binaire du point d'entrée. docker run testimg <my_cmd>
. Que se passe-t-il si nous voulons passer une valeur par défaut (argument par défaut) au point d'entrée ? Dans ce cas, il suffit de le spécifier dans la balise CMD par exemple :
From ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]
Dans ce cas, si l'utilisateur ne passe aucun argument, le conteneur utilisera la valeur par défaut (10) et la passera au point d'entrée sleep.
Maintenant, utilisons simplement CMD et omettons la définition de ENTRYPOINT :
FROM ubuntu
CMD ["sleep", "5"]
Si nous reconstruisons et exécutons cette image, elle dormira pendant 5 secondes.
Donc, en résumé, vous pouvez utiliser ENTRYPOINT afin que votre conteneur agisse comme un exécutable. Vous pouvez utiliser CMD pour fournir des arguments par défaut à votre point d'entrée ou pour exécuter une commande personnalisée au démarrage de votre conteneur qui peut être remplacée par l'utilisateur depuis l'extérieur.
2 votes
^ que ! Merci @slm . Voici une autre référence très similaire qui pourrait être un peu plus à jour : docs.docker.com/reference/builder/#entrypoint
84 votes
Aussi déroutant que la différence entre
ADD
etCOPY
5 votes
Ce lien fournit la différence entre RUN, CMD, et ENTRYPOINT : goinbigdata.com/docker-run-vs-cmd-vs-entrypoint
2 votes
Notez simplement que
CMD
etENTRYPOINT
Les deux ont des formes différentes à écrire, exec et coquille forme. Faites-vous donc une faveur et comprenez les différences subtiles de comportement en fonction de la forme utilisée. Puis lisez docs.docker.com/engine/reference/builder/ .0 votes
Je pense que cette phoenixnap.com/kb/docker-cmd-vs-entrypoint l'explique très clairement.
4 votes
C'est le meilleur blog que j'ai trouvé goinbigdata.com/docker-run-vs-cmd-vs-entrypoint