web-dev-qa-db-fra.com

Docker compose attendre l'initialisation du service de base de données

J'ai un projet de démarrage de printemps que j'aimerais conteneuriser à l'aide de docker. J'ai quelques applications de démarrage à ressort qui se connectent au même serveur MySql.

Mes applications Spring nécessitent que la base de données soit complètement configurée (c'est-à-dire toutes les tables à créer et certaines données à insérer dans certaines tables) pour démarrer.

J'utilise Docker version 18.09. et docker-compose version 1.23.1 et ubuntu 16.04 LTS


J'ai deux fichiers create.sql et insert.sql, que j'utilise pour initialiser la base de données à utiliser par l'application.

Je crée les images en utilisant la commande docker-compose.yml et il s'exécute avec succès et crée les images.

J'ai les questions suivantes.

  1. Je suppose qu'en utilisant docker-compose, un conteneur démarre dès que tous ses conteneurs dépendants ont démarré. Existe-t-il un moyen d'attendre que le serveur mysql soit opérationnel et prêt à accepter les connexions, avant que mon conteneur API ne démarre?

  2. Si j'ai choisi de créer des conteneurs séparément pour les applications et mysql, et de ne pas utiliser docker-compose, comment puis-je m'assurer que mes applications se connectent au conteneur mysql?

  3. Existe-t-il un autre outil qui pourrait m'aider à atteindre cet objectif?

Note: J'ai essayé d'utiliser docker inspect <container_id> pour trouver l'adresse IP pour le conteneur mysql et l'utiliser pour se connecter, mais cela ne fonctionne pas aussi bien.


Voici les fichiers que j'utilise pour créer des images.

docker-compose.yml fichier.

version: '3'

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root

  demo-api:
    image: demo-api-1.0
    build: ./api
    depends_on:
      - demo-mysql
    ports:
      - 8080:8080
    environment:
      - DATABASE_Host=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

  demo1-app:
    image: demo1-app-1.0
    build: ./demo1
    depends_on:
      - demo-mysql
    ports:
      - 8090:8090
    environment:
      - DATABASE_Host=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

Ce qui suit est le Dockerfile pour le projet Spring Boot

FROM Java:8

VOLUME /tmp

ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080

EXPOSE ${APP_PORT}

ADD /build/libs/demo-api.jar demo-api.jar

ENTRYPOINT ["Java","-jar","demo-api.jar"]

Ce qui suit est le Dockerfile J'ai utilisé pour créer mon image mysql

FROM mysql:5.7

ENV MYSQL_DATABASE=demo \
    MYSQL_USER=root \
    MYSQL_ROOT_PASSWORD=root

ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d

EXPOSE 3306
5
greenPadawan

Utilisez la fonction healthcheck de docker-compose ( https://docs.docker.com/compose/compose-file/#healthcheck ). Quelque chose comme ça:

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root
    healthcheck:
      test: ["CMD-Shell", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

Les conteneurs dépendants ne démarreront pas tant que le conteneur demo-mysql ne sera pas sain

2
Simonluca Landi