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.