FAQ Compose
Quelle est la différence entre docker compose
et docker-compose
La version un du binaire en ligne de commande Docker Compose a été publiée pour la première fois en 2014. Il était écrit en Python et s'invoque avec docker-compose
. Typiquement, les projets Compose v1 incluent un élément version de niveau supérieur dans le fichier compose.yaml
, avec des valeurs allant de 2.0 à 3.8, qui se réfèrent aux formats de fichier spécifiques.
La version deux du binaire en ligne de commande Docker Compose a été annoncée en 2020, est écrite en Go, et s'invoque avec docker compose
. Compose v2 ignore l'élément version de niveau supérieur dans le fichier compose.yaml.
Pour plus d'informations, voir Histoire et développement de Compose.
Quelle est la différence entre up
, run
, et start
?
Typiquement, vous voulez docker compose up
. Utilisez up
pour démarrer ou redémarrer tous les services définis dans un compose.yaml
. En mode "attaché" par défaut, vous voyez tous les logs de tous les conteneurs. En mode "détaché" (-d
), Compose se ferme après avoir démarré les conteneurs, mais les conteneurs continuent à tourner en arrière-plan.
La commande docker compose run
est pour exécuter des tâches "ponctuelles" ou "ad hoc". Elle nécessite le nom du service que vous voulez exécuter et ne démarre des conteneurs que pour les services dont le service en cours d'exécution dépend. Utilisez run
pour exécuter des tests ou effectuer une tâche administrative comme supprimer ou ajouter des données à un conteneur de volume de données. La commande run
agit comme docker run -ti
en ce qu'elle ouvre un terminal interactif vers le conteneur et retourne un statut de sortie correspondant au statut de sortie du processus dans le conteneur.
La commande docker compose start
n'est utile que pour redémarrer des conteneurs qui ont été précédemment créés mais qui ont été arrêtés. Elle ne crée jamais de nouveaux conteneurs.
Pourquoi mes services prennent-ils 10 secondes à recréer ou s'arrêter ?
La commande docker compose stop
tente d'arrêter un conteneur en envoyant un SIGTERM
. Elle attend ensuite un
délai d'expiration par défaut de 10 secondes. Après le délai d'expiration, un SIGKILL
est envoyé au conteneur pour le tuer de force. Si vous attendez ce délai d'expiration, cela signifie que vos conteneurs ne s'arrêtent pas quand ils reçoivent le signal SIGTERM
.
Il y a déjà beaucoup d'écrits sur ce problème de processus gérant les signaux dans les conteneurs.
Pour résoudre ce problème, essayez les solutions suivantes :
-
Assurez-vous d'utiliser la forme exec de
CMD
etENTRYPOINT
dans votre Dockerfile.Par exemple, utilisez
["program", "arg1", "arg2"]
et non"program arg1 arg2"
. Utiliser la forme chaîne fait que Docker exécute votre processus en utilisantbash
qui ne gère pas les signaux correctement. Compose utilise toujours la forme JSON, donc ne vous inquiétez pas si vous surchargez la commande ou le point d'entrée dans votre fichier Compose. -
Si vous le pouvez, modifiez l'application que vous exécutez pour ajouter un gestionnaire de signal explicite pour
SIGTERM
. -
Définissez le
stop_signal
à un signal que l'application sait comment gérer :services: web: build: . stop_signal: SIGINT
-
Si vous ne pouvez pas modifier l'application, encapsulez l'application dans un système d'init léger (comme s6) ou un proxy de signal (comme dumb-init ou tini). L'un ou l'autre de ces wrappers prend en charge la gestion correcte de
SIGTERM
.
Comment exécuter plusieurs copies d'un fichier Compose sur le même hôte ?
Compose utilise le nom du projet pour créer des identifiants uniques pour tous les conteneurs et autres ressources d'un projet. Pour exécuter plusieurs copies d'un projet, définissez un nom de projet personnalisé en utilisant l'option de ligne de commande -p
ou la
variable d'environnement COMPOSE_PROJECT_NAME
.
Puis-je utiliser JSON au lieu de YAML pour mon fichier Compose ?
Oui. YAML est un sur-ensemble de JSON donc tout fichier JSON devrait être un YAML valide. Pour utiliser un fichier JSON avec Compose, spécifiez le nom de fichier à utiliser, par exemple :
$ docker compose -f compose.json up
Dois-je inclure mon code avec COPY
/ADD
ou un volume ?
Vous pouvez ajouter votre code à l'image en utilisant la directive COPY
ou ADD
dans un Dockerfile
. Ceci est utile si vous devez déplacer votre code avec l'image Docker, par exemple quand vous envoyez du code vers un autre environnement (production, CI, etc).
Utilisez un volume
si vous voulez apporter des modifications à votre code et les voir reflétées immédiatement, par exemple quand vous développez du code et que votre serveur supporte le rechargement de code à chaud ou le live-reload.
Il peut y avoir des cas où vous voulez utiliser les deux. Vous pouvez avoir l'image qui inclut le code en utilisant un COPY
, et utiliser un volume
dans votre fichier Compose pour inclure le code de l'hôte pendant le développement. Le volume écrase le contenu du répertoire de l'image.