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