Utilisation de ENTRYPOINT vs CMD dans Dockerfile
Dans Docker, il existe deux instructions pour spécifier quelle commande doit s'exécuter au démarrage d'un conteneur : CMD et ENTRYPOINT. Elles ont des objectifs et des comportements différents, et comprendre la différence est important pour la gestion des conteneurs.
Comprendre ENTRYPOINT et CMD
ENTRYPOINT : Définit l'exécutable qui s'exécutera au démarrage du conteneur. Il est plus difficile de le remplacer au moment de l'exécution.
CMD : Fournit des arguments par défaut pour l'ENTRYPOINT ou peut spécifier l'intégralité de la commande si ENTRYPOINT n'est pas utilisé. Il est facile de le remplacer au moment de l'exécution.
Explorons la différence en créant deux Dockerfiles différents.
Tout d'abord, créez un nouveau script Python qui accepte les arguments de ligne de commande :
nano greeting.py
Ajoutez le code suivant :
import sys
print("Script started!")
if len(sys.argv) > 1:
print(f"Arguments provided: {sys.argv[1:]}")
for arg in sys.argv[1:]:
print(f"- {arg}")
else:
print("No arguments provided.")
print("Script finished!")
Enregistrez et quittez nano.
Maintenant, créons un Dockerfile qui utilise CMD :
nano Dockerfile.cmd
Ajoutez le contenu suivant :
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
CMD ["python", "greeting.py", "default", "arguments"]
Enregistrez et quittez nano.
Construisez l'image :
docker build -t python-cmd -f Dockerfile.cmd .
Maintenant, créez un autre Dockerfile qui utilise ENTRYPOINT :
nano Dockerfile.entrypoint
Ajoutez le contenu suivant :
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
ENTRYPOINT ["python", "greeting.py"]
CMD ["default", "arguments"]
Enregistrez et quittez nano.
Construisez l'image :
docker build -t python-entrypoint -f Dockerfile.entrypoint .
Tester CMD vs ENTRYPOINT
Exécutons des conteneurs à partir des deux images et observons les différences.
Tout d'abord, exécutez un conteneur en utilisant l'image CMD sans arguments supplémentaires :
docker run --name cmd-container python-cmd
La sortie devrait être similaire à :
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
Maintenant, exécutez un conteneur avec l'image CMD mais fournissez des arguments personnalisés :
docker run --name cmd-container-custom python-cmd hello world
Sortie :
Script started!
No arguments provided.
Script finished!
Notez que l'intégralité de la commande a été remplacée par hello world, qui ne sont pas passés comme arguments à notre script.
Maintenant, exécutons un conteneur en utilisant l'image ENTRYPOINT sans arguments supplémentaires :
docker run --name entrypoint-container python-entrypoint
Sortie :
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
Enfin, exécutez un conteneur avec l'image ENTRYPOINT et fournissez des arguments personnalisés :
docker run --name entrypoint-container-custom python-entrypoint hello world
Sortie :
Script started!
Arguments provided: ['hello', 'world']
- hello
- world
Script finished!
Cette fois, nos arguments sont correctement passés au script Python car ENTRYPOINT définit l'exécutable, et tous les arguments supplémentaires fournis à docker run sont passés à cet exécutable.
Bonnes pratiques
- Utilisez
ENTRYPOINT pour les conteneurs qui doivent toujours exécuter une commande spécifique (comme notre script Python)
- Utilisez
CMD pour fournir des arguments par défaut qui peuvent être facilement remplacés
- Combinez les deux en utilisant
ENTRYPOINT pour la commande et CMD pour les arguments par défaut
Nettoyez les conteneurs :
docker rm cmd-container cmd-container-custom entrypoint-container entrypoint-container-custom
Vous avez maintenant appris la différence entre CMD et ENTRYPOINT dans Docker, ce qui est essentiel pour contrôler comment vos scripts Python s'exécutent au démarrage d'un conteneur.