{"id":12528,"date":"2020-01-13T22:09:15","date_gmt":"2020-01-13T20:09:15","guid":{"rendered":"https:\/\/www.datanovia.com\/en\/?post_type=dt_courses&#038;p=12528"},"modified":"2020-01-13T22:09:15","modified_gmt":"2020-01-13T20:09:15","slug":"forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes","status":"publish","type":"dt_courses","link":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/","title":{"rendered":"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates"},"content":{"rendered":"<div id=\"rdoc\">\n<p>Cet article d\u00e9crit comment configurer le fichier <code>docker-compose.yml<\/code> pour faire en sorte que <strong>docker compose attende que les d\u00e9pendances<\/strong> soient pr\u00eates avant de d\u00e9marrer un conteneur d\u2019application donn\u00e9.<\/p>\n<p>Nous allons introduire deux outils diff\u00e9rents (<a href=\"https:\/\/github.com\/jwilder\/dockerize\">dockerize<\/a> et <a href=\"https:\/\/github.com\/ufoscout\/docker-compose-wait\">docker-compose-wait<\/a>) pour faire en sorte que docker compose attende que le service ou les d\u00e9pendances d\u00e9marrent. Vous pouvez utiliser ces deux solutions pour d\u00e9ployer votre pile d\u2019applications, en particulier lorsque vous souhaitez faire:<\/p>\n<ul>\n<li><em>docker compose attendre mysql<\/em>,<\/li>\n<li><em>docker compose attendre postgres<\/em>,<\/li>\n<li><em>docker compose attendre redis<\/em> ou<\/li>\n<li><em>docker compose attendre mongodb<\/em><\/li>\n<\/ul>\n<p>Vous apprendrez un exemple simple et complexe avec MongoDB, Postgres, MySQL.<\/p>\n<p>Sommaire:<\/p>\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#exemple-de-fichier-docker-compose.yml\">Exemple de fichier docker-compose.yml<\/a><\/li>\n<li><a href=\"#le-probleme\">Le probl\u00e8me<\/a><\/li>\n<li><a href=\"#solution-1-utilisation-de-loutil-dockerize\">Solution 1 : Utilisation de l\u2019outil dockerize<\/a>\n<ul>\n<li><a href=\"#description\">Description<\/a><\/li>\n<li><a href=\"#demarrage-rapide\">D\u00e9marrage rapide<\/a><\/li>\n<li><a href=\"#etape-0-telecharger-un-modele\">Etape 0 : T\u00e9l\u00e9charger un mod\u00e8le<\/a><\/li>\n<li><a href=\"#etape-1-ajouter-dockerize-au-dockerfile-de-votre-application\">Etape 1 : Ajouter dockerize au Dockerfile de votre application<\/a><\/li>\n<li><a href=\"#etape-2-modifiez-votre-fichier-docker-compose.yml\">Etape 2 : Modifiez votre fichier docker-compose.yml<\/a><\/li>\n<li><a href=\"#etape-3-creer-et-executer-votre-application\">Etape 3 : Cr\u00e9er et ex\u00e9cuter votre application<\/a><\/li>\n<li><a href=\"#etape-4-arret-des-conteneurs-et-nettoyage\">Etape 4 : Arr\u00eat des conteneurs et nettoyage<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#solution-2-utilisation-de-loutil-docker-composer-wait\">Solution 2 : Utilisation de l\u2019outil docker-composer-wait<\/a>\n<ul>\n<li><a href=\"#description-1\">Description<\/a><\/li>\n<li><a href=\"#demarrage-rapide-1\">D\u00e9marrage rapide<\/a><\/li>\n<li><a href=\"#etape-0-telecharger-un-modele-1\">Etape 0 : T\u00e9l\u00e9charger un mod\u00e8le<\/a><\/li>\n<li><a href=\"#etape-1-ajouter-loutil-docker-compose-wait-au-dockerfile-de-votre-application\">Etape 1 : Ajouter l\u2019outil docker-compose-wait au Dockerfile de votre application<\/a><\/li>\n<li><a href=\"#etape-2-modifiez-votre-fichier-docker-compose.yml-1\">Etape 2 : Modifiez votre fichier docker-compose.yml<\/a><\/li>\n<li><a href=\"#etape-3-creer-et-executer-votre-application-1\">Etape 3 : Cr\u00e9er et ex\u00e9cuter votre application<\/a><\/li>\n<li><a href=\"#etape-4-arret-des-conteneurs-et-nettoyage-1\">Etape 4 : Arr\u00eat des conteneurs et nettoyage<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#exemple-complexe-avec-mongodb-postgres-mysql\">Exemple complexe avec MongoDB, Postgres, MySQL<\/a><\/li>\n<li><a href=\"#resume\">R\u00e9sum\u00e9<\/a><\/li>\n<li><a href=\"#voir-aussi\">Voir aussi<\/a><\/li>\n<li><a href=\"#references\">R\u00e9f\u00e9rences<\/a><\/li>\n<\/ul>\n<\/div>\n<div id=\"exemple-de-fichier-docker-compose.yml\" class=\"section level2\">\n<h2>Exemple de fichier docker-compose.yml<\/h2>\n<p>L\u2019exemple simple suivant comprend 2 services : <code>my_super_app<\/code>, qui d\u00e9pend d\u2019une base de donn\u00e9es <code>mysql<\/code>.<\/p>\n<pre class=\"yaml\"><code>version: '3.6'\r\nservices:\r\n  mysql:\r\n    image: \"mysql:5.7\"\r\n    container_name: mysql\r\n    restart: always\r\n    volumes:\r\n      - .\/mysql:\/var\/lib\/mysql\r\n    environment:\r\n      - MYSQL_ROOT_PASSWORD=your_password\r\n      - MYSQL_USER=root\r\n      - MYSQL_PASSWORD=your_password\r\n      - MYSQL_DATABASE=wordpress\r\n    ports:\r\n      - \"3306:3306\"\r\n\r\n  my_super_app:\r\n    build: .\/my_super_app\r\n    image: \"my_super_app:latest\"\r\n    container_name: my_supper_app\r\n    depends_on:\r\n      - mysql<\/code><\/pre>\n<p>You can control the order of service startup and shutdown with the <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/#depends-on\">depends_on option<\/a>. Compose d\u00e9marre et arr\u00eate toujours les conteneurs dans l\u2019ordre des d\u00e9pendances, o\u00f9 les d\u00e9pendances sont d\u00e9termin\u00e9es par <code>depends_on<\/code>, <code>links<\/code>, <code>volumes_from<\/code>, et <code>network_mode: \"service:...\"<\/code>.<\/p>\n<p>Cependant, au d\u00e9marrage, Compose n\u2019attend pas qu\u2019un conteneur soit \u201cpr\u00eat\u201d (quoi que cela signifie pour votre application particuli\u00e8re) - seulement qu\u2019il soit en cours d\u2019ex\u00e9cution.<\/p>\n<\/div>\n<div id=\"le-probleme\" class=\"section level2\">\n<h2>Le probl\u00e8me<\/h2>\n<p>Quand vous courez <code>docker-compose up<\/code>, docker starts the <code>mysql<\/code> database container first and then the <code>my_super_app<\/code>. Cependant, la base de donn\u00e9es MySQL peut ne pas \u00eatre pr\u00eate avant l\u2019ex\u00e9cution de l\u2019application web.<\/p>\n<p>L\u2019application web va essayer de se connecter \u00e0 la base de donn\u00e9es, qui est peut-\u00eatre encore en cours d\u2019initialisation, ce qui entra\u00eene le plantage de l\u2019application. Et parce que c\u2019est une course, vous ne verrez probablement pas \u00e7a \u00e0 chaque fois.<\/p>\n<p>La solution interm\u00e9diaire est d\u2019ajouter <code>restart : always<\/code> \u00e0 la configuration de notre application, pour r\u00e9essayer jusqu\u2019\u00e0 ce que la base de donn\u00e9es commence \u00e0 r\u00e9pondre. Une meilleure solution consiste \u00e0 utiliser l\u2019un des outils suivants : <a href=\"https:\/\/github.com\/jwilder\/dockerize\">outil dockerize<\/a>, <a href=\"https:\/\/github.com\/ufoscout\/docker-compose-wait\">outil docker-compose-wait<\/a>, <a href=\"https:\/\/github.com\/Eficode\/wait-for\">wait-for<\/a> et <a href=\"https:\/\/github.com\/vishnubob\/wait-for-it\">wait-for-it<\/a>.<\/p>\n<\/div>\n<div id=\"solution-1-utilisation-de-loutil-dockerize\" class=\"section level2\">\n<h2>Solution 1 : Utilisation de l\u2019outil dockerize<\/h2>\n<div id=\"description\" class=\"section level3\">\n<h3>Description<\/h3>\n<p>Dockerize est un utilitaire pour simplifier l\u2019ex\u00e9cution des applications dans les conteneurs docker. Il vous permet de:<\/p>\n<ul>\n<li>g\u00e9n\u00e9rer des fichiers de configuration de l\u2019application au d\u00e9marrage du conteneur \u00e0 partir de mod\u00e8les et de variables d\u2019environnement du conteneur<\/li>\n<li>Afficher plusieurs fichiers logs vers stdout et\/ou stderr<\/li>\n<li>Attendez que d\u2019autres services soient disponibles en utilisant TCP, HTTP(S), unix avant de lancer le processus principal.<\/li>\n<\/ul>\n<p>Ici, nous allons nous concentrer sur comment <strong>faire en sorte que docker compose attende les autres d\u00e9pendances<\/strong>. Dockerize vous donne la possibilit\u00e9 d\u2019attendre des services sur un protocole sp\u00e9cifique (<code>file<\/code>, <code>tcp<\/code>, <code>tcp4<\/code>, <code>tcp6<\/code>, <code>http<\/code>, <code>https<\/code> et <code>unix<\/code>) avant de d\u00e9marrer votre application:<\/p>\n<pre class=\"bash\"><code>dockerize -wait tcp:\/\/db:5432 -wait http:\/\/web:80 -wait file:\/\/\/tmp\/generated-file<\/code><\/pre>\n<p><strong>Arguments importants<\/strong>:<\/p>\n<ul>\n<li><em>timeout<\/em>. You can optionally specify how long to wait for the services to become available by using the <code>-timeout #<\/code> argument (Default: 10 seconds). Si le d\u00e9lai d\u2019attente est atteint et que le service n\u2019est toujours pas disponible, le processus se termine avec le code de statut 1.<\/li>\n<li><em>wait-retry-interval<\/em>. Le temps de sommeil de dockerize avant de v\u00e9rifier si les d\u00e9pendances sont pr\u00eates<\/li>\n<\/ul>\n<pre class=\"bash\"><code>dockerize -wait tcp:\/\/db:5432 -wait http:\/\/web:80 -timeout 10s -wait-retry-interval 3s<\/code><\/pre>\n<\/div>\n<div id=\"demarrage-rapide\" class=\"section level3\">\n<h3>D\u00e9marrage rapide<\/h3>\n<pre class=\"bash\"><code># Download a template\r\ngit clone https:\/\/github.com\/kassambara\/docker-compose-wait-for-container.git\r\n\r\n# Build the demo application\r\ncd docker-compose-wait-for-container\/ex02-using-dockerize-tool\r\ndocker-compose build\r\n# Running your app\r\ndocker-compose run my_super_app\r\n\r\n# Stopping containers and cleaning\r\ndocker-compose down \r\nrm -rf mysql<\/code><\/pre>\n<\/div>\n<div id=\"etape-0-telecharger-un-modele\" class=\"section level3\">\n<h3>Etape 0 : T\u00e9l\u00e9charger un mod\u00e8le<\/h3>\n<pre class=\"bash\"><code># Download a template\r\ngit clone https:\/\/github.com\/kassambara\/docker-compose-wait-for-container.git\r\ncd docker-compose-wait-for-container\/ex02-using-dockerize-tool<\/code><\/pre>\n<p><strong>Structure de dossier de projet<\/strong>:<\/p>\n<pre><code>files\/docker-compose-wait-for-container\/ex02-using-dockerize-tool\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u2514\u2500\u2500 my_super_app\r\n    \u251c\u2500\u2500 Dockerfile\r\n    \u2514\u2500\u2500 sayhello<\/code><\/pre>\n<p>Contenu essentiel du projet:<\/p>\n<ul>\n<li><code>docker-compose.yml<\/code> pour g\u00e9rer tous les services de conteneurs<\/li>\n<li><code>my_super_app<\/code> scripts : mod\u00e8le Dockerfile pour construire votre application. Ici, cette application de d\u00e9mo vous demandera votre nom et vous f\u00e9licitera ensuite !<\/li>\n<\/ul>\n<\/div>\n<div id=\"etape-1-ajouter-dockerize-au-dockerfile-de-votre-application\" class=\"section level3\">\n<h3>Etape 1 : Ajouter dockerize au Dockerfile de votre application<\/h3>\n<p><strong>Utilisez ceci pour l\u2019image Ubuntu<\/strong>:<\/p>\n<pre class=\"dockerfile\"><code>RUN apt-get update &amp;&amp; apt-get install -y wget\r\n\r\nENV DOCKERIZE_VERSION v0.6.1\r\nRUN wget https:\/\/github.com\/jwilder\/dockerize\/releases\/download\/$DOCKERIZE_VERSION\/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; tar -C \/usr\/local\/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz<\/code><\/pre>\n<p><strong>Ou ceci pour les images alpines<\/strong>:<\/p>\n<pre class=\"dockerfile\"><code>RUN apk add --no-cache openssl\r\n\r\nENV DOCKERIZE_VERSION v0.6.1\r\nRUN wget https:\/\/github.com\/jwilder\/dockerize\/releases\/download\/$DOCKERIZE_VERSION\/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; tar -C \/usr\/local\/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz<\/code><\/pre>\n<p><strong>Exemple de Dockerfile utilisant l\u2019image <code>alpine<\/code><\/strong>:<\/p>\n<pre class=\"dockerfile\"><code>FROM alpine:latest\r\n\r\n# Add hello scripts\r\nADD sayhello \/sayhello\r\nRUN chmod +x \/sayhello\r\n\r\n# Add dockerize tool -------------------\r\nRUN apk add --no-cache openssl\r\nENV DOCKERIZE_VERSION v0.6.1\r\nRUN wget https:\/\/github.com\/jwilder\/dockerize\/releases\/download\/$DOCKERIZE_VERSION\/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; tar -C \/usr\/local\/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \\\r\n    &amp;&amp; rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz\r\n\r\nCMD [\"\/sayhello\"]<\/code><\/pre>\n<\/div>\n<div id=\"etape-2-modifiez-votre-fichier-docker-compose.yml\" class=\"section level3\">\n<h3>Etape 2 : Modifiez votre fichier docker-compose.yml<\/h3>\n<pre class=\"yaml\"><code>version: '3.6'\r\nservices:\r\n  mysql:\r\n    image: \"mysql:5.7\"\r\n    container_name: mysql\r\n    restart: always\r\n    volumes:\r\n      - .\/mysql:\/var\/lib\/mysql\r\n    environment:\r\n      - MYSQL_ROOT_PASSWORD=your_password\r\n      - MYSQL_USER=root\r\n      - MYSQL_PASSWORD=your_password\r\n      - MYSQL_DATABASE=wordpress\r\n    ports:\r\n      - \"3306:3306\"\r\n    expose:\r\n      - 3306\r\n\r\n  my_super_app:\r\n    build: .\/my_super_app\r\n    image: \"my_super_app:latest\"\r\n    container_name: my_supper_app\r\n    depends_on:\r\n      - mysql\r\n    command: sh -c \"dockerize -wait tcp:\/\/mysql:3306 -timeout 300s -wait-retry-interval 30s \/sayhello\"<\/code><\/pre>\n<p>En gros, Dockerize est un emballage. <code>dockerize notre_command_normal<\/code> appelle juste notre commande. Mais en option, nous pouvons ajouter des param\u00e8tres pour <em>retarder l\u2019ex\u00e9cution<\/em>, <em>cr\u00e9er un template de fichier<\/em> ou <em>rediriger la sortie des fichiers vers STDOUT\/STDERR<\/em>. Op\u00e9rations tr\u00e8s courantes et utiles dans un monde de Docker.<\/p>\n<p><strong>Exemples de configurations optionnelles de dockerize<\/strong>:<\/p>\n<pre class=\"bash\"><code># redirect files to stdout and stderr\r\ndockerize \\\r\n  -stdout info.log \\\r\n  -stdout perf.log \\\r\n  ...\r\n\r\n# wait for 2 services with 10s timeout\r\ndockerize \\\r\n  -wait tcp:\/\/db:5432 \\\r\n  -wait http:\/\/web:80 \\\r\n  -timeout 10s \\\r\n  ...\r\n\r\n# template option\r\ndockerize \\\r\n  -template nginx.tmpl:nginx.conf \\\r\n  ...<\/code><\/pre>\n<\/div>\n<div id=\"etape-3-creer-et-executer-votre-application\" class=\"section level3\">\n<h3>Etape 3 : Cr\u00e9er et ex\u00e9cuter votre application<\/h3>\n<pre class=\"bash\"><code># Building your app\r\ncd docker-compose-wait-for-container\/ex02-using-dockerize-tool\r\ndocker-compose build\r\n# Running your app\r\ndocker-compose run my_super_app<\/code><\/pre>\n<div class=\"block\">\n<p>Plus de course ! Dockerize retarde le d\u00e9marrage de notre commande jusqu\u2019\u00e0 ce que la base de donn\u00e9es soit disponible. Pas seulement commenc\u00e9 - il attend des connexions. C\u2019est une diff\u00e9rence entre Dockerize et depends_on.<\/p>\n<\/div>\n<p>Log de la console:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/dn-tutorials\/docker-compose-wait-for-container\/images\/docker-compose-wait-for-mysql-dockerize-logs.png\" alt=\"Logs de l\u2019attente de docker compose\" \/><\/p>\n<div class=\"success\">\n<p>Apr\u00e8s avoir tap\u00e9 votre nom, vous verrez un message de f\u00e9licitations de my_super_app<\/p>\n<\/div>\n<\/div>\n<div id=\"etape-4-arret-des-conteneurs-et-nettoyage\" class=\"section level3\">\n<h3>Etape 4 : Arr\u00eat des conteneurs et nettoyage<\/h3>\n<pre class=\"bash\"><code>docker-compose down \r\nrm -rf mysql<\/code><\/pre>\n<\/div>\n<\/div>\n<div id=\"solution-2-utilisation-de-loutil-docker-composer-wait\" class=\"section level2\">\n<h2>Solution 2 : Utilisation de l\u2019outil docker-composer-wait<\/h2>\n<div id=\"description-1\" class=\"section level3\">\n<h3>Description<\/h3>\n<p>L\u2019outil <a href=\"https:\/\/github.com\/ufoscout\/docker-compose-wait\">docker-compose-wait<\/a> est un petit utilitaire en ligne de commande pour attendre que d\u2019autres images docker soient lanc\u00e9es lors de l\u2019utilisation de docker-compose. Il permet d\u2019attendre un nombre fixe de secondes et\/ou d\u2019attendre qu\u2019un port TCP soit ouvert sur une image cible.<\/p>\n<p>Comme pour l\u2019outil <code>dockerize<\/code>, vous devez ajouter l\u2019outil docker-compose-wait dans votre application Dockerfile.<\/p>\n<\/div>\n<div id=\"demarrage-rapide-1\" class=\"section level3\">\n<h3>D\u00e9marrage rapide<\/h3>\n<pre class=\"bash\"><code># Download a template\r\ngit clone https:\/\/github.com\/kassambara\/docker-compose-wait-for-container.git\r\n\r\n# Build the demo application\r\ncd docker-compose-wait-for-container\/ex01-using-wait-tool\r\ndocker-compose build\r\n# Running your app\r\ndocker-compose run my_super_app\r\n\r\n# Stopping containers and cleaning\r\ndocker-compose down \r\nrm -rf mysql<\/code><\/pre>\n<\/div>\n<div id=\"etape-0-telecharger-un-modele-1\" class=\"section level3\">\n<h3>Etape 0 : T\u00e9l\u00e9charger un mod\u00e8le<\/h3>\n<pre class=\"bash\"><code># Download a template\r\ngit clone https:\/\/github.com\/kassambara\/docker-compose-wait-for-container.git\r\ncd docker-compose-wait-for-container\/ex02-using-dockerize-tool<\/code><\/pre>\n<p><strong>Structure de dossier de projet<\/strong>:<\/p>\n<pre><code>files\/docker-compose-wait-for-container\/ex01-using-wait-tool\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u2514\u2500\u2500 my_super_app\r\n    \u251c\u2500\u2500 Dockerfile\r\n    \u2514\u2500\u2500 sayhello<\/code><\/pre>\n<\/div>\n<div id=\"etape-1-ajouter-loutil-docker-compose-wait-au-dockerfile-de-votre-application\" class=\"section level3\">\n<h3>Etape 1 : Ajouter l\u2019outil docker-compose-wait au Dockerfile de votre application<\/h3>\n<p>Exemple de Dockerfile utilisant l\u2019image <code>alpine<\/code>:<\/p>\n<pre class=\"dockerfile\"><code>FROM alpine:latest\r\n\r\n# Add hello scripts\r\nADD sayhello \/sayhello\r\nRUN chmod +x \/sayhello\r\n\r\n# Add docker-compose-wait tool -------------------\r\nENV WAIT_VERSION 2.7.2\r\nADD https:\/\/github.com\/ufoscout\/docker-compose-wait\/releases\/download\/$WAIT_VERSION\/wait \/wait\r\nRUN chmod +x \/wait\r\n\r\nCMD [\"\/sayhello\"]<\/code><\/pre>\n<\/div>\n<div id=\"etape-2-modifiez-votre-fichier-docker-compose.yml-1\" class=\"section level3\">\n<h3>Etape 2 : Modifiez votre fichier docker-compose.yml<\/h3>\n<pre class=\"yaml\"><code>version: '3.6'\r\nservices:\r\n  mysql:\r\n    image: \"mysql:5.7\"\r\n    container_name: mysql\r\n    restart: always\r\n    volumes:\r\n      - .\/mysql:\/var\/lib\/mysql\r\n    environment:\r\n      - MYSQL_ROOT_PASSWORD=your_password\r\n      - MYSQL_USER=root\r\n      - MYSQL_PASSWORD=your_password\r\n      - MYSQL_DATABASE=wordpress\r\n    ports:\r\n      - \"3306:3306\"\r\n    expose:\r\n      - 3306\r\n\r\n  my_super_app:\r\n    build: .\/my_super_app\r\n    image: \"my_super_app:latest\"\r\n    container_name: my_supper_app\r\n    depends_on:\r\n      - mysql\r\n    command: sh -c \"\/wait &amp;&amp; \/sayhello\"\r\n    environment:\r\n      - WAIT_HOSTS=mysql:3306\r\n      - WAIT_HOSTS_TIMEOUT=300\r\n      - WAIT_SLEEP_INTERVAL=30\r\n      - WAIT_HOST_CONNECT_TIMEOUT=30<\/code><\/pre>\n<div class=\"success\">\n<ul>\n<li>La commande <code>sh -c \u201c\/wait &amp;&amp; \/sayhello\u201d<\/code> lancera l\u2019outil wait et ensuite votre application, ici \/sayhello.<\/li>\n<li>Quand le docker-compose est lanc\u00e9 (ou Kubernetes ou docker stack ou autre), votre application sera lanc\u00e9e seulement quand toutes les paires host:port de la variable <code>WAIT_HOSTS<\/code> sont disponibles. Quand le docker-compose est lanc\u00e9 (ou Kubernetes ou docker stack ou autre), votre application sera lanc\u00e9e seulement quand toutes les paires host:port de la variable <code>WAIT_HOSTS<\/code> sont disponibles. La variable d\u2019environnement <code>WAIT_HOSTS<\/code> n\u2019est pas obligatoire, si elle n\u2019est pas d\u00e9clar\u00e9e, le script s\u2019ex\u00e9cute sans attendre.<\/li>\n<li>Pour que votre conteneur d\u2019application Docker <strong>attende plusieurs h\u00f4tes<\/strong>, la variable d\u2019environnement peut \u00eatre sp\u00e9cifi\u00e9e comme ceci par exemple <code>WAIT_HOSTS=mysql:3306, nginx:80<\/code><\/li>\n<\/ul>\n<\/div>\n<p><strong>Options de configuration suppl\u00e9mentaires<\/strong>. Le comportement de l\u2019utilitaire d\u2019attente peut \u00eatre configur\u00e9 avec les variables d\u2019environnement suivantes:<\/p>\n<ul>\n<li><em>WAIT_HOSTS<\/em> : liste s\u00e9par\u00e9e par des virgules des paires h\u00f4te:port pour lesquelles vous voulez attendre.<\/li>\n<li><em>WAIT_HOSTS_TIMEOUT<\/em> : nombre maximum de secondes d\u2019attente pour que tous les h\u00f4tes soient disponibles avant l\u2019\u00e9chec. La valeur par d\u00e9faut est de 30 secondes.<\/li>\n<li><em>WAIT_HOST_CONNECT_TIMEOUT<\/em> : Le d\u00e9lai d\u2019attente d\u2019une connexion TCP unique \u00e0 un h\u00f4te distant avant de tenter une nouvelle connexion. La valeur par d\u00e9faut est de 5 secondes.<\/li>\n<li><em>WAIT_BEFORE_HOSTS<\/em> : nombre de secondes \u00e0 attendre (sleep) avant de commencer \u00e0 v\u00e9rifier la disponibilit\u00e9 des h\u00f4tes<\/li>\n<li><em>WAIT_AFTER_HOSTS<\/em> : nombre de secondes \u00e0 attendre (sleep) une fois que tous les h\u00f4tes sont disponibles<\/li>\n<li><em>WAIT_SLEEP_INTERVAL<\/em> : nombre de secondes de sommeil entre deux tentatives. La valeur par d\u00e9faut est 1 seconde.<\/li>\n<\/ul>\n<\/div>\n<div id=\"etape-3-creer-et-executer-votre-application-1\" class=\"section level3\">\n<h3>Etape 3 : Cr\u00e9er et ex\u00e9cuter votre application<\/h3>\n<pre class=\"bash\"><code># Building your app\r\ncd docker-compose-wait-for-container\/ex01-using-wait-tool\r\ndocker-compose build\r\n# Running your app\r\ndocker-compose run my_super_app<\/code><\/pre>\n<p>Log de la console:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/dn-tutorials\/docker-compose-wait-for-container\/images\/docker-compose-wait-for-mysql-logs.png\" alt=\"Logs de l\u2019attente de docker compose\" \/><\/p>\n<div class=\"success\">\n<p>Apr\u00e8s avoir tap\u00e9 votre nom, vous verrez un message de f\u00e9licitations de my_super_app<\/p>\n<\/div>\n<\/div>\n<div id=\"etape-4-arret-des-conteneurs-et-nettoyage-1\" class=\"section level3\">\n<h3>Etape 4 : Arr\u00eat des conteneurs et nettoyage<\/h3>\n<pre class=\"bash\"><code>docker-compose down \r\nrm -rf mysql<\/code><\/pre>\n<\/div>\n<\/div>\n<div id=\"exemple-complexe-avec-mongodb-postgres-mysql\" class=\"section level2\">\n<h2>Exemple complexe avec MongoDB, Postgres, MySQL<\/h2>\n<pre class=\"yaml\"><code>version: \"3.6\"\r\n\r\nservices:\r\n\r\n  mongo:\r\n    image: mongo:3.4\r\n    hostname: mongo\r\n    ports:\r\n      - \"27017:27017\"\r\n\r\n  postgres:\r\n    image: \"postgres:9.4\"\r\n    hostname: postgres\r\n    ports:\r\n      - \"5432:5432\"\r\n\r\n  mysql:\r\n    image: \"mysql:5.7\"\r\n    hostname: mysql\r\n    ports:\r\n      - \"3306:3306\"\r\n\r\n  my_super_app:\r\n    build: .\/my_super_app\r\n    image: \"my_super_app:latest\"\r\n    container_name: my_supper_app\r\n    depends_on:\r\n      - mysql\r\n    command: sh -c \"\/wait &amp;&amp; \/sayhello\"\r\n    environment:\r\n      - WAIT_HOSTS=postgres:5432, mysql:3306, mongo:27017\r\n      - WAIT_HOSTS_TIMEOUT=300\r\n      - WAIT_SLEEP_INTERVAL=30\r\n      - WAIT_HOST_CONNECT_TIMEOUT=30<\/code><\/pre>\n<\/div>\n<div id=\"resume\" class=\"section level2\">\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Ce tutoriel d\u00e9crit comment faire attendre les d\u00e9pendances de conteneurs par les outils <code>dockerize<\/code> et <code>docker-compose-wait<\/code>.<\/p>\n<\/div>\n<div id=\"voir-aussi\" class=\"section level2\">\n<h2>Voir aussi<\/h2>\n<ul>\n<li>wait-for-it: Script bash pur pour tester et attendre la disponibilit\u00e9 d\u2019un h\u00f4te et d\u2019un port TCP](<a class=\"uri\" href=\"https:\/\/github.com\/vishnubob\/wait-for-it\">https:\/\/github.com\/vishnubob\/wait-for-it<\/a>)<\/li>\n<\/ul>\n<\/div>\n<div id=\"references\" class=\"section level2\">\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li><a href=\"https:\/\/rock-it.pl\/better-docker-containers-with-dockerize-wrapper\/\">Meilleure exp\u00e9rience de Docker avec Dockerize<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jwilder\/dockerize\">Dockerize : Utilitaire pour simplifier l\u2019ex\u00e9cution d\u2019applications dans les conteneurs docker<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/ufoscout\/docker-compose-wait\">docker-compose-wait : Un simple script pour attendre que d\u2019autres images docker soient lanc\u00e9es pendant l\u2019utilisation de docker-compose<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p><!--end rdoc--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.<\/p>\n","protected":false},"author":1,"featured_media":12529,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","class_list":["post-12528","dt_courses","type-dt_courses","status-publish","has-post-thumbnail","hentry","course_category-docker-fr"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia<\/title>\n<meta name=\"description\" content=\"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia\" \/>\n<meta property=\"og:description\" content=\"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/\" \/>\n<meta property=\"og:site_name\" content=\"Datanovia\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/\",\"url\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/\",\"name\":\"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia\",\"isPartOf\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg\",\"datePublished\":\"2020-01-13T20:09:15+00:00\",\"description\":\"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage\",\"url\":\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg\",\"contentUrl\":\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg\",\"width\":1024,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.datanovia.com\/en\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cours\",\"item\":\"https:\/\/www.datanovia.com\/en\/fr\/courses\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#website\",\"url\":\"https:\/\/www.datanovia.com\/en\/fr\/\",\"name\":\"Datanovia\",\"description\":\"Exploration de Donn\u00e9es et Statistiques pour l'Aide \u00e0 la D\u00e9cision\",\"publisher\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.datanovia.com\/en\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#organization\",\"name\":\"Datanovia\",\"url\":\"https:\/\/www.datanovia.com\/en\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2018\/09\/datanovia-logo.png\",\"contentUrl\":\"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2018\/09\/datanovia-logo.png\",\"width\":98,\"height\":99,\"caption\":\"Datanovia\"},\"image\":{\"@id\":\"https:\/\/www.datanovia.com\/en\/fr\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia","description":"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/","og_locale":"fr_FR","og_type":"article","og_title":"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia","og_description":"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.","og_url":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/","og_site_name":"Datanovia","og_image":[{"width":1024,"height":512,"url":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/","url":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/","name":"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates - Datanovia","isPartOf":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage"},"image":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg","datePublished":"2020-01-13T20:09:15+00:00","description":"D\u00e9crit comment faire en sorte que docker compose attende que les d\u00e9pendances soient pr\u00eates. Des exemples sont fournis pour MySQL, MongoDb et Postgres ou Postgresql.","breadcrumb":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#primaryimage","url":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg","contentUrl":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2019\/05\/P1040361.JPG.jpg","width":1024,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/www.datanovia.com\/en\/fr\/courses\/forcer-docker-compose-a-attendre-que-les-dependances-soient-pretes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.datanovia.com\/en\/fr\/"},{"@type":"ListItem","position":2,"name":"Cours","item":"https:\/\/www.datanovia.com\/en\/fr\/courses\/"},{"@type":"ListItem","position":3,"name":"Forcer Docker Compose \u00e0 Attendre que les D\u00e9pendances soient Pr\u00eates"}]},{"@type":"WebSite","@id":"https:\/\/www.datanovia.com\/en\/fr\/#website","url":"https:\/\/www.datanovia.com\/en\/fr\/","name":"Datanovia","description":"Exploration de Donn\u00e9es et Statistiques pour l'Aide \u00e0 la D\u00e9cision","publisher":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.datanovia.com\/en\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.datanovia.com\/en\/fr\/#organization","name":"Datanovia","url":"https:\/\/www.datanovia.com\/en\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.datanovia.com\/en\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2018\/09\/datanovia-logo.png","contentUrl":"https:\/\/www.datanovia.com\/en\/wp-content\/uploads\/2018\/09\/datanovia-logo.png","width":98,"height":99,"caption":"Datanovia"},"image":{"@id":"https:\/\/www.datanovia.com\/en\/fr\/#\/schema\/logo\/image\/"}}]}},"multi-rating":{"mr_rating_results":[]},"_links":{"self":[{"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/dt_courses\/12528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/dt_courses"}],"about":[{"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/types\/dt_courses"}],"author":[{"embeddable":true,"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/comments?post=12528"}],"version-history":[{"count":0,"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/dt_courses\/12528\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/media\/12529"}],"wp:attachment":[{"href":"https:\/\/www.datanovia.com\/en\/fr\/wp-json\/wp\/v2\/media?parent=12528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}