
Docker Compose vous permet de démarrer plusieurs conteneurs en exécutant une seule commande. Cela simplifie la mise en place de services complexes formés de plusieurs composants indépendants.
Ce n'est cependant pas toujours suffisant. Certains de vos conteneurs peuvent avoir des dépendances entre eux qui interrompent l'application s'ils ne peuvent pas être remplis. Dans ce guide, nous allons vous montrer comment configurer vos services Compose pour prendre en charge ces dépendances, ce qui permet de démarrer les conteneurs dans l'ordre.
Les bases
Docker Compose prend en charge un champ depend_on dans les fichiers docker.compose.yml. Les services peuvent inclure les noms de leurs frères et sœurs dans depend_on. Cela empêche le démarrage du conteneur tant que les services dont il dépend ne sont pas activés.
services : api : image : example.com/api:latest depend_on : – db web-app : image : example.com/web-app : latest depend_on : – api db : image : mysql:8.0
Dans cet exemple, les champs depend_on provoquent le démarrage des services dans l'ordre suivant :
- db
- api
- application Web
Les dépendances de chaque service sont résolues de manière récursive. Le service qui définit chaque champ depend_on est démarré en dernier, à la toute fin de la chaîne. Lorsqu'un service dépend de plusieurs autres conteneurs, ils sont démarrés dans l'ordre dans lequel ils sont répertoriés dans le champ depend_on.
La chaîne de services est utilisée à l'envers lorsque vous arrêtez une pile avec docker-composer stop. Avec l'exemple ci-dessus, le conteneur d'application Web sera d'abord supprimé, puis api et db. Cela empêche les requêtes adressées au conteneur d'application Web d'échouer lorsqu'une opération de démontage commence.
En attente de préparation
La configuration par défaut depend_on attend uniquement le démarrage des conteneurs dépendants. Dans l'exemple ci-dessus, Compose peut créer le conteneur API dès que la base de données est en cours d'exécution, même si le serveur de base de données à l'intérieur du conteneur n'est pas prêt à recevoir des connexions. Cela signifie que depend_on suffit rarement à lui seul.
Vous pouvez combiner la fonctionnalité avec des vérifications de l'état pour empêcher le démarrage des conteneurs tant que leurs dépendances ne sont pas réellement prêtes. Pour utiliser cette fonctionnalité, imbriquez un champ de condition sous depend_on avec service_healthy comme valeur :
services : api : image : example.com/api:latest depend_on : – db healthcheck : test : curl –fail http://127.0.0.1 || sortie 1 intervalle : 10s tentatives : 5 start_period : 5s timeout : 10s web-app : image : example.com/web-app:latest depend_on : api : condition : service_healthy db : image : mysql:8.0
Maintenant, le conteneur api a une commande de vérification de l'état attachée. Le service d'application Web est invité à ne pas démarrer tant que l'API n'a pas été créée avec un résultat de vérification de l'état réussi. Ce sera une fois que l'API commencera à répondre aux demandes et que la commande curl se terminera avec un code d'état zéro.
En attente d'une sortie réussie du conteneur< /h2>
Dans certains cas, votre dépendance peut être un conteneur à usage unique que vous souhaitez exécuter jusqu'à la fin. Vous pouvez attendre ce type de dépendance en définissant le champ de condition sur service_completed_successfully. Ceci est utile lorsque vous avez un script de configuration de première exécution qui s'exécute dans un autre conteneur.
services : app : image : example.com/app:latest depend_on : config_builder : condition : service_completed_successfully volumes : – config :/opt/app/config config_builder : image : example.com/config_builder:latest env : – EXAMPLE_KEY – ANOTHER_KEY volumes : – config:/output volumes : config :
Cet exemple montre comment une image dépendante peut exécuter une commande qui écrit un fichier de configuration sur un volume partagé par app. Une fois les données écrites, le conteneur config_builder s'arrête avec un code de sortie nul. Compose démarre alors automatiquement le service d'application car sa condition de dépendance a été remplie.
Plus de contrôle avec d'autres outils
Dans certaines situations depend_on avec une condition peut ne pas être suffisant pour s'adapter à votre cas d'utilisation. Vous pouvez ajouter des outils externes pour implémenter manuellement des vérifications de l'état et gérer les liens entre les conteneurs.
Wait-for-It est un script utilitaire qui enveloppe un autre processus. Il exécutera la commande que vous spécifiez une fois qu'une certaine condition est remplie. Cela peut être utilisé pour définir des procédures de vérification de l'état indépendamment de la prise en charge intégrée de Docker.
Voici comment utiliser la vérification de l'état pour attendre qu'un port de conteneur lié devienne accessible :
services : api : image : example.com/api:latest depend_on : – application Web db : image : example.com/web-app:latest depend_on : – commande api : [" ;./wait-for- it.sh”, “api:8080”, “–“, “node”, “app.js” " " db : image : mysql:8.0Ici, nous sommes revenus à faire en sorte que Docker Compose attende que le conteneur d'API démarre. Le service d'application Web accepte la responsabilité de vérifier si l'API est saine. Il utilise le script Wait-for-It pour détecter quand le conteneur est accessible sur le port 8080. Wait-for-It lancera alors la commande réelle du conteneur d'application Web, définie comme node app.js.
Cette approche est mieux réservée aux situations spécifiques où vous ne pouvez pas configurer une vérification d'état appropriée avec Docker. Cela peut être nécessaire lorsque vous utilisez une image tierce qui ne peut pas être configurée pour exécuter une commande de vérification de l'état. Wait-for-It fournit un moyen de détecter si un port dessert le trafic en remplacement. Bien qu'il ne soit pas infaillible, il s'agit souvent d'un bon indicateur de la salubrité d'un conteneur.
Résumé
Par défaut, Docker Compose démarre simultanément tous les services de votre pile. Ceci est souvent indésirable lorsque des liens entre les services créent des relations de dépendance parent-enfant.
Le champ depend_on vous permet de définir une séquence de démarrage pour vos services. Compose créera chaque nouveau conteneur dans l'ordre, garantissant que le précédent a démarré avant que le conteneur suivant ne soit ajouté.
Vous pouvez attendre que le conteneur précédent se ferme ou signaler un bilan de santé positif en ajoutant une condition à la dépendance définition. Dans les situations où les vérifications de l'état ne peuvent pas être utilisées, vous pouvez vous en remettre à des outils comme Wait-for-It pour que les conteneurs parents détectent quand leurs dépendances sont prêtes.
LIRE LA SUITE
- ’ 10 fonctionnalités Mac cachées que vous devriez utiliser
- › Test du Google Pixel 6a : un excellent téléphone de milieu de gamme un peu court
- &rsaquo ; Examen de la serrure SwitchBot : une méthode de pointe pour déverrouiller votre porte
- &rsaquo ; “Apportez votre propre conducteur vulnérable” Les attaques cassent Windows
- &rsaquo ; Vous pouvez placer votre téléviseur à l'extérieur
- &rsaquo ; 10 fonctionnalités Chromebook que vous devriez utiliser