Outils pour utilisateurs

Outils du site


sysadmin:docker:cmd_vs_entrypoint

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
sysadmin:docker:cmd_vs_entrypoint [2021/12/29 17:53] yoannsysadmin:docker:cmd_vs_entrypoint [2021/12/30 00:18] (Version actuelle) yoann
Ligne 122: Ligne 122:
 ===== Utilisation conjointe ===== ===== Utilisation conjointe =====
  
-Jusqu'à présent on a proposer d'utiliser soit **CMD** soit **ENTRYPOINT** mais pas les deux conjointement.+Jusqu'à présent on a proposé d'utiliser soit **CMD** soit **ENTRYPOINT** mais pas les deux conjointement. Ce cas peut cependant s'avérer utile. 
 + 
 +La combinaison des directives  **ENTRYPOINT** et **CMD** permet de spécifier l' exécutable par défaut pour l'image tout en fournissant à l'utilisateur une façon simple de redéfinir certains arguments ou options. 
 + 
 +<file> 
 +RUN apt-get update && apt-get install -y iputils-ping procps 
 + 
 +# Binaire et options non modifiables 
 +ENTRYPOINT ["/bin/ping", "-c", "10"
 + 
 +# Arguments et options redéfinissables 
 +# facilement par l'utilisateur 
 +CMD ["localhost"
 +</file> 
 + 
 +<code bash> 
 +# Création d'une nouvelle image 
 +docker image build -t "phobos/debian:together"
 + 
 +# Création et exécution d'un conteneur basé sur la nouvelle  image  
 +docker container run --rm --name test_together -t phobos/debian:together 
 + 
 +docker container ps -a 
 +CONTAINER ID   IMAGE                    COMMAND                       CREATED          STATUS                       
 +14dcebd6b360   phobos/debian:together   "/bin/ping -c 10 localhost"   45 seconds ago   Exited (0) 34 seconds ago 
 +</code> 
 + 
 +On note que la commande exécutée dans le conteneur est une combinaison de d' **ENTRYPOINT** et de **CMD**. Quand les deux directives existent dans le Dockerfile, les valeurs de **CMD** sont ajoutées à celle d' **ENTRYPOINT** pour créer la commande à exécuter dans le conteneur. 
 + 
 +Les valeurs définies via CMD pouvant facilement être redéfinies par l'utilisateur (par ajout d'un ou plusieurs arguments après le nom de l'image dans la commande "docker run"), on peut utiliser ce comportement pour proposer une option par défaut indéfinissable par l'utilisateur. 
 + 
 +Dans l'exemple ci-dessus la cible par défaut "localhost" peut  
 +être remplacé à l'execution de la manière suivante: 
 + 
 +<code bash> 
 +# Création d'un conteneur avec redéfinition des arguments par défaut 
 +docker container run phobos/debian:together gateway.phobos.lan 
 + 
 +# Liste les conteneurs existants 
 +docker container ps -a 
 +CONTAINER ID   IMAGE                    COMMAND                                CREATED              STATUS 
 +1f0e6fd6d6de   phobos/debian:together   "/bin/ping -c 10 gateway.phobos.lan"   About a minute ago   Exited (0) 58 seconds ago  
 +... 
 +</code> 
 + 
 +Dans ce cas exécuter l’exécution du conteneur s'apparente à la manière d’exécuter toute autre commande: on indique le nom de la commande suivie des arguments que l'on souhaite passer à cette commande. 
 + 
 +==== Toujours utiliser la forme exec en utilisation conjointe ==== 
 + 
 +Lorsqu'on utilise **ENTRYPOINT** et **CMD** conjointement il est **impératif de toujours utiliser la forme d'invocation via exec**. Essayer d'utiliser l'invocation via shell ou de mixer les méthodes d'invocation shell/exec ne donnera pas le résultat attendu. 
 + 
 +^ Dockerfile                          ^ Commande invoquée                   | 
 +| <file> 
 +ENTRYPOINT /bin/ping -c 3 
 +CMD localhost 
 +</file>                               | %% /bin/sh -c '/bin/ping -c 3' /bin/sh -c localhost%% | 
 +| <file> 
 +ENTRYPOINT ["/bin/ping","-c","3"
 +CMD localhost 
 +</file>                               | %% /bin/ping -c 3 /bin/sh -c localhost %% | 
 +| <file> 
 +ENTRYPOINT /bin/ping -c 3 
 +CMD ["localhost"
 +</file>                               | %% /bin/sh -c '/bin/ping -c 3' localhost %% | 
 +| <file> 
 +ENTRYPOINT ["/bin/ping","-c","3"
 +CMD ["localhost"
 +</file>                               | %%  /bin/ping -c 3 localhost %% | 
 + 
 +Une seule de ces combinaisons aboutie à une ligne de commande valide: celle qui utilise les formes d'invocation **exec** à la fois pour **ENTRYPOINT et CMD**.
  
-En combinant  **ENTRYPOINT** et **CMD** 
  
 ===== Références ===== ===== Références =====
  
   * https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd   * https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd
sysadmin/docker/cmd_vs_entrypoint.1640800433.txt.gz · Dernière modification : 2021/12/29 17:53 de yoann