GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

La différence entre CMD et ENTRYPOINT dans les images Docker

Le CMD et ENTRYPOINT les instructions sont deux Dockerfile couramment confondus directives. Les deux ont un rôle dans la détermination de la commande qui s'exécutera au démarrage du conteneur.

Le CMD et ENTRYPOINT peuvent être remplacés individuellement dans chaque image. L'utilisation efficace de ces directives facilite l'utilisation de votre conteneur en raccourcissant la longueur des commandes que vous fournissez.

Qu'est-ce que le point d'entrée ?

Nous allons regarder ENTRYPOINT d'abord car il est traité avant CMD lors du démarrage d'un nouveau conteneur. Le point d'entrée de l'image définit le processus qui sera exécuté au démarrage du conteneur.

Docker définit par défaut le point d'entrée sur /bin/sh -c . Cela signifie que vous vous retrouverez dans une session shell lorsque vous démarrerez le conteneur. Pour de nombreux conteneurs, il est plus souhaitable d'avoir un lancement de processus différent par défaut. Vous voulez que les services sans tête commencent leur charge de travail immédiatement.

Réglage du ENTRYPOINT directive dans un Dockerfile demande à Docker d'exécuter une commande spécifique au démarrage du conteneur. Il deviendra le processus de premier plan, au lieu de la session shell par défaut.

ENTRYPOINT ["date"]

Un conteneur créé avec ce Dockerfile exécutera la date commande. Comme date n'est pas un processus de premier plan de longue durée, le conteneur se fermera immédiatement après.

Les points d'entrée doivent être des binaires ou des scripts exécutables. Votre conteneur ne démarrera pas si vous spécifiez un point d'entrée non valide. Si vous utilisez un script personnalisé, assurez-vous que le bit exécutable est défini. Vous pouvez ajouter des autorisations d'exécution en utilisant chmod +x my-script.sh .

Ajout de la commande (CMD)

Le CMD l'instruction est quelque chose d'un terme impropre. Il fournit des arguments par défaut pour la commande définie par ENTRYPOINT .

ENTRYPOINT ["date"]
CMD ["+%A"]

Cet exemple donne au conteneur l'exécution de date +%A . Le +%A argument de date affiche le jour de la semaine en cours (par exemple Monday ).

CMD est conçu pour être dépassé. docker run vous permet de spécifier une commande différente pour une instance de conteneur individuelle :

docker run my-image +%B

Le CMD par défaut sera remplacé par +%B , ce qui fait que le conteneur affiche le nom du mois en cours. Cela fonctionne car le point d'entrée de l'image reste intact. Le CMD est toujours ajouté au ENTRYPOINT , donc la commande finale devient date +%B .

Vous devez utiliser ENTRYPOINT pour définir l'exécutable principal de votre conteneur. Utiliser CMD pour définir les arguments par défaut pour cet exécutable. Il sera remplacé lorsque le conteneur sera exécuté avec des arguments différents.

Remplacements de point d'entrée

Vous pouvez forcer Docker à démarrer une image à l'aide d'un point d'entrée personnalisé. Passez le --entrypoint indicateur pour docker run :

docker run --entrypoint /bin/sh my-image

Le point d'entrée défini dans l'image du conteneur sera ignoré au profit de la commande que vous avez spécifiée. Dans notre exemple, une session shell sera démarrée, au lieu de la date commande.

Le remplacement des points d'entrée devrait être un événement rare. Cela peut aller à l'encontre des intentions de l'auteur de l'image. La définition d'un point d'entrée personnalisé peut cependant être utile, en particulier lors du débogage. Si un conteneur se comporte mal, le remplacement de son point d'entrée peut vous accorder un accès au shell que vous ne pourriez pas obtenir autrement.

Lequel utiliser ?

Si vous êtes un auteur d'images, vous devez utiliser ENTRYPOINT lors de la définition de ce que votre conteneur exécutera. Si vous souhaitez fournir des arguments par défaut, mais que vous vous attendez à ce que l'utilisateur les remplace, incluez CMD aussi.

En tant qu'utilisateur d'image, vous pouvez normalement vous en tenir à l'écrasement de CMD . docker run a un support transparent pour les remplacements de commande. Tous les arguments fournis après le nom de l'image seront interprétés comme le CMD chaîne pour le conteneur.

Modes de point d'entrée :Shell ou Exec

Docker prend en charge deux formes différentes de ENTRYPOINT :mode exec et mode shell. Le mode Exec se caractérise par l'utilisation d'une construction de tableau pour spécifier les paramètres. En mode shell, la commande est spécifiée sous la forme d'une chaîne.

# exec mode
ENTRYPOINT ["binary", "--param", "--another-param"]

# shell mode
ENTRYPOINT binary --param --another-param

L'utilisation du mode shell entraîne l'exécution de votre binaire en tant que sous-processus de /bin/sh -c . Cela donne à votre point d'entrée un accès aux variables d'environnement définies par le shell.

Le mode Shell a cependant des compromis. Vous ne pouvez pas utiliser CMD afin que les utilisateurs ne puissent pas émettre de dérogations. Arguments donnés à docker run sera ignoré ; votre conteneur utilisera toujours le point d'entrée tel quel.

Étant donné que votre binaire s'exécute dans un shell, les commandes de cycle de vie Docker telles que docker stop peut fonctionner de manière erratique ou pas du tout. Docker signalera le shell pour arrêter, au lieu du processus à l'intérieur. Vous pouvez lancer votre processus avec exec pour éviter cela.

ENTRYPOINT exec binary --param --another-param

Avantages de l'approche du point d'entrée de Docker

Séparer le point d'entrée de ses arguments vous aide à masquer la complexité dans vos conteneurs. Ceci est particulièrement avantageux lorsque vous créez des conteneurs d'utilitaires pour encapsuler des programmes CLI.

Définissez le binaire de votre CLI comme point d'entrée de l'image. Cela permet aux utilisateurs d'interagir sans répéter le nom binaire dans chaque commande.

Considérez si nous avons empaqueté le Dockerfile ci-dessus comme date:latest :

# default entrypoint (/bin/sh -c)
docker run date:latest date +%A

# with `date` as the entrypoint
docker run date:latest +%A`

La définition d'un point d'entrée personnalisé raccourcit les commandes et réduit les répétitions. Le conteneur devient plus spécialisé en appelant date automatiquement. Cela crée une interface plus conviviale pour vos utilisateurs.

Résumé

ENTRYPOINT de Docker et CMD les instructions sont une source fréquente de confusion. Leur dénomination masque leurs objectifs.

Utilisez ENTRYPOINT pour définir la "commande" qui s'exécutera au démarrage de nouveaux conteneurs. Vous pouvez définir des arguments par défaut en utilisant CMD . ENTRYPOINT et CMD sont combinés pour produire la chaîne de commande finale du conteneur.

Lorsque vous utilisez docker run , Docker remplace le CMD par défaut de l'image avec les arguments que vous spécifiez. Si vous devez remplacer le point d'entrée d'une image, utilisez le --entrypoint drapeau.


Docker
  1. Quelle est la différence entre InnoDB et MyISAM ?

  2. Quelle est la différence entre un conteneur Linux et une image ?

  3. différence entre podman et docker.

  4. La Différence Entre Nss Et Pam?

  5. Quelle est la différence entre COPY et ADD dans Dockerfiles ?

Commandes Docker CMD vs. Entrypoint :Quelle est la différence ?

La différence entre sudo et su expliquée

Comment mettre à jour l'image Docker et le conteneur vers la dernière version

Utilisation des instructions Dockerfile ENTRYPOINT et CMD

Comment copier des fichiers entre l'hôte et le conteneur Docker

Quelle est la différence entre unlink et rm ?