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.
Sommaire
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.