Le site ENTRYPOINT
spécifie une commande qui sera toujours exécutée au démarrage du conteneur.
Le site CMD
spécifie les arguments qui seront fournis à la ENTRYPOINT
.
Si vous voulez faire une image dédiée à une commande spécifique, vous utiliserez ENTRYPOINT ["/path/dedicated_command"]
Sinon, si vous voulez faire une image pour un usage général, vous pouvez laisser ENTRYPOINT
non spécifié et utilisation CMD ["/path/dedicated_command"]
car vous pourrez remplacer ce paramètre en fournissant des arguments à l'option docker run
.
Par exemple, si votre Dockerfile est :
FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]
L'exécution de l'image sans aucun argument fera un ping sur le localhost :
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms
Maintenant, l'exécution de l'image avec un argument fera un ping de l'argument :
$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms
À titre de comparaison, si votre Dockerfile est :
FROM debian:wheezy
CMD ["/bin/ping", "localhost"]
L'exécution de l'image sans aucun argument fera un ping sur le localhost :
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms
Mais exécuter l'image avec un argument exécutera l'argument :
docker run -it test bash
root@e8bb7249b843:/#
Voir cet article de Brian DeHamer pour plus de détails : https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
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