Forcer Docker Compose à Attendre que les Dépendances soient Prêtes

Forcer Docker Compose à Attendre Un Conteneur en Utilisant l’Outil Wait

Cet article fournit un exemple de guide reproductible pas à pas pour faire en sorte que docker compose attende les dépendances d’un conteneur (exemple : MySQL, Postgres, Redis, Mongodb) en utilisant l’outil docker-composer-wait.

L’outil docker-compose-wait est un petit utilitaire en ligne de commande pour attendre que d’autres images docker soient lancées pendant l’utilisation de docker-compose. Il permet d’attendre un nombre fixe de secondes et/ou d’attendre qu’un port TCP soit ouvert sur une image cible.

Comme pour l’outil dockerize, vous devez ajouter l’outil docker-compose-wait dans votre application Dockerfile.



Sommaire:

Démarrage rapide

# Download a template
git clone https://github.com/kassambara/docker-compose-wait-for-container.git

# Build the demo application
cd docker-compose-wait-for-container/ex01-using-wait-tool
docker-compose build
# Running your app
docker-compose run my_super_app

# Stopping containers and cleaning
docker-compose down 
rm -rf mysql

Etape 0 : Télécharger un modèle

# Download a template
git clone https://github.com/kassambara/docker-compose-wait-for-container.git
cd docker-compose-wait-for-container/ex02-using-dockerize-tool

Structure de dossier de projet:

files/docker-compose-wait-for-container/ex01-using-wait-tool
├── docker-compose.yml
└── my_super_app
    ├── Dockerfile
    └── sayhello

Contenu essentiel du projet:

  • docker-compose.yml pour gérer tous les services de conteneurs
  • my_super_app scripts : modèle Dockerfile pour construire votre application. Ici, cette application de démo vous demandera votre nom et vous félicitera ensuite !

Etape 1 : Ajouter l’outil docker-compose-wait au Dockerfile de votre application

Exemple de Dockerfile utilisant l’image alpine:

FROM alpine:latest

# Add hello scripts
ADD sayhello /sayhello
RUN chmod +x /sayhello

# Add docker-compose-wait tool -------------------
ENV WAIT_VERSION 2.7.2
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/$WAIT_VERSION/wait /wait
RUN chmod +x /wait

CMD ["/sayhello"]

Etape 2 : Modifiez votre fichier docker-compose.yml

version: '3.6'
services:
  mysql:
    image: "mysql:5.7"
    container_name: mysql
    restart: always
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=your_password
      - MYSQL_USER=root
      - MYSQL_PASSWORD=your_password
      - MYSQL_DATABASE=wordpress
    ports:
      - "3306:3306"
    expose:
      - 3306

  my_super_app:
    build: ./my_super_app
    image: "my_super_app:latest"
    container_name: my_supper_app
    depends_on:
      - mysql
    command: sh -c "/wait && /sayhello"
    environment:
      - WAIT_HOSTS=mysql:3306
      - WAIT_HOSTS_TIMEOUT=300
      - WAIT_SLEEP_INTERVAL=30
      - WAIT_HOST_CONNECT_TIMEOUT=30
  • La commande sh -c “/wait && /sayhello” lancera l’outil wait et ensuite votre application, ici /sayhello.
  • Quand le docker-compose est lancé (ou Kubernetes ou docker stack ou autre), votre application sera lancée seulement quand toutes les paires host:port de la variable WAIT_HOSTS sont disponibles. La variable d’environnement WAIT_HOSTS n’est pas obligatoire, si elle n’est pas déclarée, le script s’exécute sans attendre.
  • Pour que votre conteneur d’application Docker attende plusieurs hôtes, la variable d’environnement peut être spécifiée comme ceci par exemple WAIT_HOSTS=mysql:3306, nginx:80

Options de configuration supplémentaires. Le comportement de l’utilitaire d’attente peut être configuré avec les variables d’environnement suivantes:

  • WAIT_HOSTS : liste séparée par des virgules des paires hôte:port pour lesquelles vous voulez attendre.
  • WAIT_HOSTS_TIMEOUT : nombre maximum de secondes d’attente pour que tous les hôtes soient disponibles avant l’échec. La valeur par défaut est de 30 secondes.
  • WAIT_HOST_CONNECT_TIMEOUT : Le délai d’attente d’une connexion TCP unique à un hôte distant avant de tenter une nouvelle connexion. La valeur par défaut est de 5 secondes.
  • WAIT_BEFORE_HOSTS : nombre de secondes à attendre (sleep) avant de commencer à vérifier la disponibilité des hôtes
  • WAIT_AFTER_HOSTS : nombre de secondes à attendre (sleep) une fois que tous les hôtes sont disponibles
  • WAIT_SLEEP_INTERVAL : nombre de secondes de sommeil entre deux tentatives. La valeur par défaut est 1 seconde.

Etape 3 : Créer et exécuter votre application

# Building your app
cd docker-compose-wait-for-container/ex01-using-wait-tool
docker-compose build
# Running your app
docker-compose run my_super_app

Log de la console:

Logs de l’attente de docker compose

Après avoir tapé votre nom, vous verrez un message de félicitations de my_super_app

Etape 4 : Arrêt des conteneurs et nettoyage

docker-compose down 
rm -rf mysql

Résumé

Cet article décrit comment faire en sorte que docker compose attende les dépendances d’un conteneur à l’aide de l’outil docker-compose-wait.



Version: English

Forcer Docker Compose à Attendre un Conteneur en Utilisant Dockerize (Prev Lesson)
(Next Lesson) Docker Compose: Attendre que Le Conteneur MySQL soit Prêt
Back to Forcer Docker Compose à Attendre que les Dépendances soient Prêtes

No Comments

Give a comment

Want to post an issue with R? If yes, please make sure you have read this: How to Include Reproducible R Script Examples in Datanovia Comments