Présentation
Les conteneurs sont conçus pour exécuter des tâches et des processus spécifiques , pas pour héberger des systèmes d'exploitation. Vous créez un conteneur pour servir une seule tâche d'unité. Une fois qu'il a terminé la tâche donnée, il s'arrête . Par conséquent, le cycle de vie du conteneur dépend du processus en cours à l'intérieur de celui-ci. Une fois le processus arrêté, le conteneur s'arrête également.
Un Dockerfile définit ce processus. Il s'agit d'un script composé d'instructions sur la façon de créer une image Docker. Dans ce script, il existe deux types d'instructions qui peut définir le processus en cours d'exécution dans le conteneur :
- POINT D'ENTRÉE
- CMD
Dans cet article, nous expliquons les différences entre Docker ENTRYPOINT et CMD et quand utiliser quelle instruction Docker.
Docker Entrypoint vs CMD :résoudre le dilemme
En bref, CMD définit les commandes et/ou paramètres par défaut pour un conteneur. CMD est une instruction qu'il est préférable d'utiliser si vous avez besoin d'une commande par défaut que les utilisateurs peuvent facilement remplacer. Si un Dockerfile a plusieurs CMD, il n'applique que les instructions du dernier.
D'autre part, ENTRYPOINT est préférable lorsque vous souhaitez définir un conteneur avec un exécutable spécifique. Vous ne pouvez pas remplacer un ENTRYPOINT lors du démarrage d'un conteneur, sauf si vous ajoutez le --entrypoint
drapeau.
Combiner ENTRYPOINT avec CMD si vous avez besoin d'un conteneur avec un exécutable spécifié et un paramètre par défaut qui peut être modifié facilement. Par exemple, lors de la conteneurisation d'une application, utilisez ENTRYPOINT et CMD pour définir des variables spécifiques à l'environnement.
Formulaire Shell et Exec
Avant de commencer, il est important de discuter des formes d'instructions. Docker ENTRYPOINT et CMD peuvent avoir deux formes :
- Forme coquille
- Formulaire exécutif
La syntaxe de toute commande sous forme de shell est :
<instruction> <command>
La syntaxe des instructions sous forme exec est :
<instruction> ["executable", "parameter"]
Vous pouvez écrire des instructions Docker CMD/ENTRYPOINT sous les deux formes :
CMD echo "Hello World"
(forme coquille)CMD ["echo", "Hello World"]
(formulaire exécutable)ENTRYPOINT echo "Hello World"
(forme coquille)ENTRYPOINT ["echo", "Hello World"]
(formulaire exécutable)
Cependant, essayez de conserver toutes vos instructions sous forme exec pour éviter d'éventuels problèmes de performances.
Docker CMD
Docker CMD définit l'exécutable par défaut d'une image Docker. Vous pouvez exécuter cette image comme base d'un conteneur sans ajouter d'arguments de ligne de commande. Dans ce cas, le conteneur exécute le processus spécifié par la commande CMD.
L'instruction CMD n'est utilisée que s'il n'y a pas d'argument ajouté au run
commande lors du démarrage d'un conteneur. Par conséquent, si vous ajoutez un argument à la commande, vous remplacez le CMD.
Pour vous montrer comment fonctionne CMD, nous allons créer un exemple de conteneur avec une instruction CMD.
Création d'un Dockerfile avec CMD et création d'une image
1. Commencez par créer un nouveau MyDockerImage
dossier dans lequel stocker vos images :
sudo mkdir MyDockerImage
2. Déplacez-vous dans ce dossier et créez un nouveau Dockerfile :
cd MyDockerImage
sudo touch Dockerfile
3. Ouvrez le Dockerfile avec votre éditeur de texte préféré :
nano Dockerfile
4. Ajoutez ensuite le contenu suivant au fichier :
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]
Dans le contenu ci-dessus, vous pouvez voir que nous avons utilisé l'instruction CMD pour faire écho au message Hello World
lorsque le conteneur démarre sans une commande spécifiée.
5. Enregistrer et quitter le fichier.
6. L'étape suivante consiste à créer une image Docker à partir du Dockerfile nouvellement créé. Puisque nous sommes toujours dans le MyDockerImage
répertoire, vous n'avez pas besoin de spécifier l'emplacement du Dockerfile, créez simplement l'image en exécutant :
sudo docker build .
7. La sortie vous indiquera le nom du conteneur. Vous pouvez vérifier si elle est disponible parmi les images stockées localement en exécutant :
sudo docker images
Exécuter un conteneur Docker avec CMD
Pour voir CMD en action, nous allons créer un conteneur basé sur l'image créée à l'étape précédente.
Exécutez le conteneur avec la commande :
sudo docker run [image_name]
Puisqu'il n'y a pas d'argument de ligne de commande, le conteneur exécutera l'instruction CMD par défaut et affichera le Hello World
message. Cependant, si vous ajoutez un argument lors du démarrage d'un conteneur, il remplace l'instruction CMD.
Par exemple, ajoutez l'argument hostname à la commande docker run :
sudo docker run [image_name] hostname
Docker exécutera le conteneur et le hostname
au lieu de la commande echo du CMD. Vous pouvez le voir dans la sortie.
Point d'entrée Docker
ENTRYPOINT est l'autre instruction utilisée pour configurer le fonctionnement du conteneur. Tout comme avec CMD, vous devez spécifier une commande et des paramètres.
Quelle est la différence entre CMD et ENTRYPOINT ? Vous ne pouvez pas remplacer l'instruction ENTRYPOINT en ajoutant des paramètres de ligne de commande à l'exécution docker run
commande. En optant pour cette consigne, vous sous-entendez que le conteneur est spécifiquement conçu pour un tel usage.
Lisez la suite pour voir comment nous appliquons ENTRYPOINT dans la création de conteneurs.
Création d'un Dockerfile avec ENTRYPOINT et création d'une image
1. Utilisez le Dockerfile créé dans la section CMD et modifiez le fichier pour modifier l'instruction. Ouvrez le fichier existant avec un éditeur de texte :
sudo nano Dockerfile
2. Modifiez le contenu en remplaçant la commande CMD par ENTRYPOINT :
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]
3. Enregistrer et fermer le fichier.
Exécuter un conteneur Docker avec ENTRYPOINT
1. Créez une nouvelle image à l'aide de la commande suivante :
sudo docker build .
2. La sortie doit montrer que vous avez créé avec succès la nouvelle image sous un nom donné. Exécutons-le maintenant en tant que conteneur sans ajouter de paramètres de ligne de commande :
sudo docker run [container_name]
La sortie sera la même qu'avec CMD. C'est parce que nous n'avons ajouté aucun argument à la commande d'exécution.
3. Pour voir comment fonctionne ENTRYPOINT, vous devez ajouter un paramètre lors du démarrage d'un conteneur. Utilisez la même commande qu'à l'étape précédente et ajoutez quelque chose après le nom du conteneur :
sudo docker run [container_name] KnowledgeBase
Comme vous le voyez, Docker n'a pas remplacé l'instruction initiale de faire écho à Hello World. Il a simplement ajouté le nouveau paramètre à la commande existante.
Bien que vous puissiez utiliser ENTRYPOINT et CMD dans les deux formulaires, il est généralement conseillé de s'en tenir au formulaire exec . Il s'agit de la solution la plus fiable, car la forme du shell peut parfois entraîner des problèmes subtils dans le processus.
Point d'entrée Docker avec CMD
Comme vous l'avez vu jusqu'à présent, ENTRYPOINT et CMD sont similaires, mais pas identiques. De plus, ces deux instructions ne sont pas mutuellement exclusives. C'est vrai, il est possible d'avoir les deux dans votre Dockerfile.
Il existe de nombreuses situations dans lesquelles combiner CMD et ENTRYPOINT serait la meilleure solution pour votre conteneur Docker. Dans de tels cas, l'exécutable est défini avec ENTRYPOINT , tandis que CMD spécifie le paramètre par défaut .
Si vous utilisez les deux instructions, assurez-vous de les conserver sous forme exec .
Lisez la suite pour voir comment ENTRYPOINT et CMD collaborent dans notre exemple.
Exécuter un conteneur avec Entrypoint et CMD
1. Tout d'abord, nous allons modifier notre Dockerfile existant afin qu'il inclue les deux instructions. Ouvrez le fichier avec :
sudo nano Dockerfile
2. Le fichier doit inclure une instruction ENTRYPOINT spécifiant l'exécutable, ainsi qu'une instruction CMD définissant le paramètre par défaut qui doit apparaître si aucun autre n'est ajouté à la commande d'exécution :
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
3. Maintenant, créez une nouvelle image à partir du Dockerfile modifié :
sudo docker build .
4. Testons le conteneur en l'exécutant sans aucun paramètre. Saisissez la commande :
sudo docker run [container_name]
Il renverra le message Hello World
. Cependant, que se passe-t-il lorsque nous ajoutons des paramètres à la commande docker run ?
5. Utilisez à nouveau la même commande, mais cette fois ajoutez votre nom à la commande d'exécution :
sudo docker run [container_name] [your_name]
La sortie est maintenant changée en Hello [your_name]
(dans mon cas, c'est Hello Sofija
). En effet, vous ne pouvez pas remplacer les instructions ENTRYPOINT, alors qu'avec CMD, vous pouvez facilement le faire.