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

Forcer Docker Compose à Attendre un Conteneur en Utilisant Dockerize

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 dockerize.

L’outil dockerize vous donne la possibilité d’attendre les services sur un protocole spécifié (file, tcp, tcp4, tcp6, http, https et unix) avant de démarrer votre application:

dockerize -wait tcp://db:5432 -wait http://web:80 -wait file:///tmp/generated-file

Arguments importants:

  • timeout. You can optionally specify how long to wait for the services to become available by using the -timeout # argument (Default: 10 seconds). Si le délai d’attente est atteint et que le service n’est toujours pas disponible, le processus se termine avec le code de statut 1.
  • wait-retry-interval. Le temps de sommeil de dockerize avant de vérifier si les dépendances sont prêtes
dockerize -wait tcp://db:5432 -wait http://web:80 -timeout 10s -wait-retry-interval 3s


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/ex02-using-dockerize-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/ex02-using-dockerize-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 Dockerize 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 dockerize tool -------------------
RUN apk add --no-cache openssl
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz

CMD ["/sayhello"]

Utilisez ceci pour l’image Ubuntu:

# Add dockerize tool -------------------
RUN apt-get update && apt-get install -y wget
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

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 "dockerize -wait tcp://mysql:3306 -timeout 300s -wait-retry-interval 30s /sayhello"

En gros, Dockerize est un emballage. dockerize notre_command_normal appelle juste notre commande. Mais en option, nous pouvons ajouter des paramètres pour retarder l’exécution, créer un template de fichier ou rediriger la sortie des fichiers vers STDOUT/STDERR. Opérations très courantes et utiles dans un monde de Docker.

Exemples de configurations optionnelles de dockerize:

# redirect files to stdout and stderr
dockerize \
  -stdout info.log \
  -stdout perf.log \
  ...

# wait for 2 services with 10s timeout
dockerize \
  -wait tcp://db:5432 \
  -wait http://web:80 \
  -timeout 10s \
  ...

# template option
dockerize \
  -template nginx.tmpl:nginx.conf \
  ...

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

# Building your app
cd docker-compose-wait-for-container/ex02-using-dockerize-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 attente pour les dépendances de conteneurs en utilisant l’outil dockerize.



Version: English

(Next Lesson) Forcer Docker Compose à Attendre Un Conteneur en Utilisant l’Outil Wait
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