1639 votes

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

Dans Dockerfiles il y a deux commandes qui ressemblent à moi: CMD et ENTRYPOINT. Mais je pense qu'il y a un (subtile?) la différence entre eux - sinon il ne serait pas logique d'avoir deux commandes pour la même chose.

La documentation précise pour CMD

Le but principal d'un CMD est de fournir des valeurs par défaut pour l'exécution de conteneur.

et pour ENTRYPOINT:

Un point d'entrée 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?

1690voto

creack Points 11635

Docker a défaut d'un point d'entrée qui est - /bin/sh -c mais ne possède pas de commande par défaut.

Lorsque vous exécutez le panneau comme ceci: docker run -i -t ubuntu bash le point d'entrée est la valeur par défaut /bin/sh -c, l'image est - ubuntu , et la commande est bash.

La commande est exécutée via le point d'entrée. c'est à dire, la chose qui est exécutée en est - /bin/sh -c bash. Cela a permis docker à mettre en oeuvre RUN rapidement en s'appuyant sur la coque de l'analyseur. Plus tard, les gens ont demandé à être en mesure de personnaliser ce donc ENTRYPOINT et -entrypoint a été introduit.

Tout ce qui est après ubuntu dans l'exemple ci-dessus est la commande et est transmis au point d'entrée. Lors de l'utilisation de l' CMD l'enseignement, c'est exactement comme si vous faisiez docker run -i -t ubuntu <cmd>. <cmd> sera le paramètre du point d'entrée.

Comme tout est passé au point d'entrée, vous pouvez avoir une très belle comportement de vos images. @Jiri exemple est bon, il montre comment utiliser une image en tant que "binaire". Lors de l'utilisation d' ["/bin/cat"] comme point d'entrée et ensuite de faire docker run catimg /etc/passwd, vous l'obtenez, /etc/passwd est la commande et est passé pour le point d'entrée de sorte que le résultat final d'exécution est tout simplement /bin/cat /etc/passwd.

Un autre exemple serait de toute cli en tant que point d'entrée. Par exemple, si vous avez un redis à l'image, au lieu de courir docker run redisimg redis -H something -u toto get key, vous pouvez tout simplement avoir ENTRYPOINT ["redis", "-H", "something", "-u", "toto"] , puis de courir comme cela pour le même résultat: docker run redisimg get key.

168voto

Jiri Points 4193

Oui, c'est une bonne question. Je ne comprends pas encore, mais:

Je comprends qu' ENTRYPOINT est le binaire qui est en cours d'exécution. Vous pouvez annuler entrypoint par -point d'entrée="".

docker run -t -i -entrypoint="/bin/bash" ubuntu

CMD est l'argument par défaut dans le récipient. 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.

# no entrypoint
docker run ubuntu /bin/cat /etc/passwd

# entry point, emulating cat command
docker run -entrypoint="/bin/cat" ubuntu /etc/passwd

Ainsi, le principal avantage est que, avec le point d'entrée, vous pouvez passer des arguments (cmd) à votre conteneur. Pour ce faire, vous devez utiliser à la fois:

# Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/cat"]

et

docker build -t=cat .

ensuite, vous pouvez utiliser:

docker run cat /etc/passwd
#              ^^^^^^^^^^^
#                   CMD
#          ^^^      
#          image (tag)- using the default ENTRYPOINT

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