2787 votes

Quelle est la différence entre CMD et ENTRYPOINT dans un Dockerfile ?

Dans Dockerfiles, il y a deux commandes qui me semblent similaires : CMD et ENTRYPOINT . Mais je suppose qu'il y a une différence (subtile ?) entre les deux, sinon cela n'aurait aucun sens d'avoir deux commandes pour la même chose.

La documentation indique que pour CMD

L'objectif 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 comme un exécutable.

Alors, quelle est la différence entre ces deux commandes ?

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 et COPY

5 votes

Ce lien fournit la différence entre RUN, CMD, et ENTRYPOINT : goinbigdata.com/docker-run-vs-cmd-vs-entrypoint

9voto

fgul Points 86

J'ai lu toutes les réponses et je veux résumer pour une meilleure compréhension au premier coup d'œil comme suit :

Tout d'abord, l'ensemble de la commande qui est exécutée dans le conteneur comprend deux parties : le commandement et les arguments

  • ENTRYPOINT définit l'exécutable invoqué lorsque le conteneur est démarre (pour la commande)

  • CMD spécifie les arguments qui sont passés à l'ENTRYPOINT (pour les arguments)

Dans le Kubernetes en action Le livre indique une note importante à ce sujet. (chapitre 7)

Bien que vous puissiez utiliser le CMD pour spécifier la commande que vous voulez que vous voulez exécuter lorsque l'image est lancée, la bonne manière est de le faire par le biais de la ENTRYPOINT l'instruction et à spécifier uniquement le CMD si vous voulez définir les arguments par défaut.

Vous pouvez également lire ce article pour une grande explication d'une manière simple

8voto

Tahir Rauf Points 364

Commentaires sur la fonction EntryPoint dans code

// ENTRYPOINT /usr/sbin/nginx.

// Définissez le point d'entrée (qui est par défaut sh -c) à /usr/sbin/nginx.

// Acceptera les CMD comme arguments à /usr/sbin/nginx.

Une autre référence de documents

Vous pouvez utiliser la forme exec de ENTRYPOINT pour définir Commandes et arguments par défaut assez stables puis utilisez CMD pour définir des valeurs par défaut supplémentaires qui sont plus susceptibles d'être modifiées.

Exemple :

FROM ubuntu:14.04.3
ENTRYPOINT ["/bin/ping"]
CMD ["localhost", "-c", "2"]

Construire : sudo docker build -t ent_cmd .

CMD arguments are easy to override.

NO argument (sudo docker -it ent_cmd)                :  ping localhost 
argument    (sudo docker run -it ent_cmd google.com) :  ping google.com

.

To override EntryPoint argument, you need to supply entrypoint
sudo docker run -it --entrypoint="/bin/bash" ent_cmdd

p.s : En présence d'un point d'entrée, la CMD contient des arguments à transmettre au point d'entrée. En l'absence d'EntryPoint, CMD sera la commande qui sera exécutée.

5voto

Jingguo Yao Points 513

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 bifurqué du premier processus.
  • CMD ["param1","param2"] : Ce formulaire est utilisé pour fournir des arguments par défaut pour ENTRYPOINT .

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 bifurqué du premier processus.

Comme craquement dit, CMD a été développé en premier. Puis ENTRYPOINT a été développé pour plus de personnalisation. Comme elles n'ont pas été conçues ensemble, certaines fonctionnalités se chevauchent entre CMD et ENTRYPOINT, ce qui est souvent source de confusion.

2voto

Garo Points 394

La plupart des gens l'expliquent parfaitement ici, donc je ne vais pas répéter 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 fichier Docker de la forme :

FROM ubuntu:latest
CMD /bin/bash

Construisez-le, exécutez-le avec docker run -it theimage et exécuter ps -eo ppid,pid,args dans le conteneur. Comparez cette sortie à celle que vous recevez de ps lorsque vous utilisez :

  • docker run -it theimage bash
  • Reconstruction de l'image mais avec ENTRYPOINT /bin/bash et le faire fonctionner dans les deux sens
  • Utilisation de CMD ["/bin/bash"]
  • ...

De cette façon, vous pourrez facilement constater par vous-même les différences entre toutes les méthodes possibles.

2voto

MIYUKI NARAHARA Points 81

La documentation officielle des meilleures pratiques de Dockerfile explique très bien les différences. Meilleures pratiques en matière de fichiers Docker

CMD :

L'instruction CMD doit être utilisée pour exécuter le logiciel contenu dans votre image, ainsi que les arguments éventuels. CMD devrait presque toujours être utilisé sous la forme de CMD ["executable", "param1", "param2"…] . Ainsi, si l'image est pour un service, comme Apache et Rails, vous exécuterez quelque chose comme CMD ["apache2","-DFOREGROUND"] . En effet, cette forme d'instruction est recommandée pour toute image basée sur le service.

POINT D'ENTRÉE :

La meilleure utilisation de ENTRYPOINT est de définir la commande principale de l'image, permettant à cette image d'être exécutée comme si elle était cette commande (et ensuite utiliser CMD comme drapeau par défaut).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X