Les directives ENTRYPOINT et CMD dans le Dockerfile définissent la commande de démarrage par défaut pour le conteneur. Cependant, ces directives peuvent être remplacées par les arguments de ligne de commande d'exécution de Docker lors de l'exécution du conteneur.
La relation de priorité prioritaire est la suivante :
- Si
--entrypoint
l'option , elle remplacera la commande ENTRYPOINT spécifiée dans le Dockerfile. - Si un argument de ligne de commande est spécifié lors de l'exécution du conteneur, il remplacera la commande CMD spécifiée dans le Dockerfile.
- Si la commande ENTRYPOINT est spécifiée dans le Dockerfile mais pas dans la commande CMD, les arguments de la ligne de commande deviendront la commande CMD lors de l'exécution du conteneur.
- Si ni la commande ENTRYPOINT ni la commande CMD ne sont spécifiées dans le Dockerfile, lors de l'exécution du conteneur, les paramètres de la ligne de commande seront considérés comme une commande complète et exécutés directement.
Par exemple, supposons que vous ayez le Dockerfile suivant :
FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello,"]
CMD ["world!"]
Le Dockerfile définit un conteneur basé sur Ubuntu, avec "/bin/echo"
et "Hello,"
comme commandes ENTRYPOINT et "world!"
comme commandes CMD.
Si vous exécutez le conteneur sans spécifier de paramètres, les commandes par défaut ENTRYPOINT et CMD seront exécutées avec le résultat suivant :
$ docker run myimage
Hello, world!
Les commandes CMD seront remplacées si des arguments de ligne de commande sont spécifiés lors de l'exécution du conteneur, par exemple :
$ docker run myimage "GPT-3"
La sortie deviendra :
Hello, GPT-3!
Si vous spécifiez une nouvelle commande avec --entrypoint
l'option , elle remplacera la commande ENTRYPOINT, par exemple :
$ docker run --entrypoint /bin/ls myimage /
La sortie sera une liste de fichiers à la racine du conteneur.
Il convient de noter que si les commandes ENTRYPOINT et CMD sont spécifiées dans le Dockerfile, la commande CMD peut être remplacée par les paramètres de ligne de commande lors de l'exécution du conteneur, mais la commande ENTRYPOINT ne peut pas être remplacée à moins qu'une nouvelle commande ENTRYPOINT ne soit spécifiée à l'aide --entrypoint
de l'option