GNU/Linux >> Tutoriels Linux >  >> Ubuntu

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

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.


Ubuntu
  1. Quelle est la différence entre les conteneurs LXC, LXD et Docker

  2. Quelques commandes DOCKER

  3. La différence entre Sudo et Gksu est-elle la même que la différence entre Sudo -i et Sudo -s ?

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

  5. Démarrer un shell dans le conteneur Docker Alpine

Image Docker vs conteneur :les principales différences

Liste des commandes Docker :aide-mémoire

VPN vs VDI :Quelle est la différence ?

Basculement Vs. Restauration :quelle est la différence ?

Utilisation des instructions Dockerfile ENTRYPOINT et CMD

Docker File vs Docker Compose :quelle est la différence ?