Agence web » Actualités du digital » La différence entre CMD et ENTRYPOINT dans les images Docker –

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

le CMD et ENTRYPOINT les instructions sont deux communément confondues Dockerfile 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 peut être remplacé 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 comme 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émarrez le conteneur. Pour de nombreux conteneurs, il est plus souhaitable de lancer un processus différent par défaut. Vous voulez que les services headless démarrent immédiatement leur charge de travail.

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 ceci Dockerfile exécutera le date commander. Comme date n’est pas un processus de premier plan de longue durée, le conteneur sortira immédiatement après.

Les points d’entrée doivent être des binaires ou des scripts exécutables. Votre conteneur ne démarre 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 à l’aide de chmod +x my-script.sh.

Ajout de la commande (CMD)

le CMD l’instruction est quelque chose d’un abus de langage. Il fournit des arguments par défaut pour la commande définie par ENTRYPOINT.

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

Cet exemple entraîne l’exécution du conteneur date +%A. le +%A argument à date affiche le jour de la semaine en cours (par ex. Monday).

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

docker run my-image +%B

Le défaut CMD sera remplacé par +%B, ce qui amène le conteneur à afficher le nom du mois en cours. Cela fonctionne parce que le point d’entrée de l’image reste intact. le CMD est toujours ajouté à la ENTRYPOINT, donc la commande finale devient date +%B.

Tu devrais 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 est exécuté avec différents arguments.

Remplacements de points d’entrée

Vous pouvez forcer Docker à démarrer une image à l’aide d’un point d’entrée personnalisé. Passe le --entrypoint drapeau à 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 lancée, au lieu de la date commander.

Le remplacement des points d’entrée doit être 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, remplacer 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 va exécuter. Si vous souhaitez fournir des arguments par défaut, mais que vous vous attendez à ce que l’utilisateur les remplace, incluez CMD trop.

En tant qu’utilisateur d’image, vous pouvez normalement vous en tenir au remplacement CMD. docker run prend en charge de manière transparente les remplacements de commandes. Tout argument fourni après le nom de l’image sera interprété 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 exécution et mode shell. Le mode Exec est caractérisé par l’utilisation d’une construction de tableau pour spécifier des 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 l’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 des remplacements. 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 coquille 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é de vos conteneurs. Ceci est particulièrement avantageux lorsque vous créez des conteneurs 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 emballé ce qui précède Dockerfile 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 la répétition. Le conteneur devient plus spécialisé en invoquant date automatiquement. Cela crée une interface plus conviviale pour vos utilisateurs.

Résumé

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

Utiliser 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 la valeur par défaut de l’image CMD avec les arguments que vous spécifiez. Si vous devez remplacer le point d’entrée d’une image, utilisez le --entrypoint drapeau.

★★★★★