J'ai deux applications Spring qui partagent la même base de données Mysql. Ils fonctionnent parfaitement lorsque je les lance sans docker-compose. Ma machine hôte est Windows 10 professionnelle.
application.properties
version: '3'
services:
web:
build: ./web
ports:
- "8085:8085"
depends_on:
- "database"
solver:
build: ./solver
ports:
- "8095:8095"
depends_on:
- "database"
database:
image: "mysql:latest"
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
- MYSQL_DATABASE=webDatabase
healthcheck:
test: "/usr/bin/mysql --user=root --password=my-secret-pw --execute \"SHOW DATABASES;\""
interval: 10s
timeout: 20s
retries: 10
volumes:
logvolume01: {}
Dockerfile
FROM openjdk:8-jdk-alpine ADD target/web-spring-boot.jar web-spring-boot.jar EXPOSE 8085 ENTRYPOINT ["java","-jar", "web-spring-boot.jar"]
J'ai créé ce docker- compose.yml basé sur d'autres exemples.
server.port=8085 spring.jpa.show-sql=true spring.jackson.serialization.write-dates-as-timestamps=false spring.jpa.hibernate.ddl-auto=update spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306 /webDatabase?autoReconnect=true&useSSL=false spring.datasource.username=root spring.datasource.password=my-secret-pw
Cela ne fonctionne pas. Après le démarrage, seul le conteneur Mysql est en cours d'exécution.
Voici une partie de la sortie avec les journaux Spring
solver_1 | 2019-01-04 22: 55: 15.698 WARN 1 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper: Erreur SQL: 0, SQLState: 08S01 solver_1 | 2019-01-04 22: 55: 15.698 ERREUR 1 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper: échec de la liaison de communication solver_1 | solver_1 | Le dernier paquet envoyé avec succès au serveur remonte à 0 milliseconde. Le pilote n'a reçu aucun paquet du serveur.
Que me manque-t-il dans la configuration? Est-ce que application.properties est ignoré lors de l'exécution avec la composition?
3 Réponses :
Les applications Spring-Boot essaient de se connecter à localhost: 3306. Cela fonctionne très bien tant qu'ils ne s'exécutent pas dans un conteneur.
Lors de l'exécution dans le conteneur, la connexion est également essayée d'établir une connexion avec localhost (mais cette fois dans le conteneur docker de spring-boot). Cela échoue, évidemment, car dans votre conteneur de démarrage à ressort il n'y a pas de mysql en cours d'exécution.
Le service mysql est accessible dans le réseau docker par son nom d'alias (base de données).
Reconfigurer votre spring.datasource.url à
spring.datasource.url=jdbc:mysql://database:3306/webDatabase?autoReconnect=true&useSSL=false
Cela peut être fait dans votre application.properties ou en utilisant des variables d'environnement dans votre fichier docker-compose.
p>
Cela semble s'être amélioré. Cependant, j'obtiens maintenant cette erreur "web_1 | 2019-01-04 21: 57: 09.037 WARN 1 --- [nio-8085-exec-2] ohengine.jdbc.spi.SqlExceptionHelper: Erreur SQL: 1046, SQLState: 3D000 web_1 | 2019-01-04 21: 57: 09.037 ERREUR 1 --- [nio-8085-exec-2] ohengine.jdbc.spi.SqlExceptionHelper: Aucune base de données sélectionnée "
Avez-vous ajouté le composant / webDatabase? AutoReconnect = true & useSSL = false? Je l'ai manqué à cause de l'espace
J'essaie de suivre ces exemples de gars: springbootdev.com/2018/01/08/...
J'ai enfin pu lancer l'application.
Voici les configurations
version: '3'
services:
web:
build: ./web-spring
ports:
- "8085:8085"
depends_on:
- "database"
volumes:
- /data/spring-boot-app
solver:
build: ./solver
ports:
- "8095:8095"
depends_on:
- "database"
- "web"
database:
image: "mysql:latest"
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
- MYSQL_DATABASE=mysqldatabase
volumes:
- /data/mysql
healthcheck:
test: ["CMD", "mysqldatabase" ,"ping", "-h", "database"]
timeout: 1s
retries: 100
volumes:
logvolume01: {}
docker-compose.yml
server.port=8095 spring.jpa.show-sql=true spring.jackson.serialization.write-dates-as-timestamps=false #spring.h2.console.enabled=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.datasource.url=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=my-secret-pw
Au lieu de coder en dur la chaîne de source de données MySQL dans votre application.properties, vous pouvez la transmettre à partir de la configuration docker-compose. De plus, vous utilisez le nom de service «base de données» défini dans docker-compose pour créer une entrée codée en dur dans votre application.properties.
Pour éviter cela, faites quelque chose comme ci-dessous:
version: '3'
services:
web:
build: ./web-spring
ports:
- "8085:8085"
depends_on:
- "database"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true
volumes:
- /data/spring-boot-app
solver:
build: ./solver
ports:
- "8095:8095"
depends_on:
- "database"
- "web"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true
database:
image: "mysql:latest"
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
- MYSQL_DATABASE=mysqldatabase
volumes:
- /data/mysql
healthcheck:
test: ["CMD", "mysqldatabase" ,"ping", "-h", "database"]
timeout: 1s
retries: 100
volumes:
logvolume01: {}
Remarque: Vous pouvez convertir toutes les propriétés d'application communes de Spring Boot en une variable d'environnement en remplaçant le point (.) par un trait de soulignement ( _)
Deux questions, êtes-vous certain que le Dockerfile Web est en fait sous ./web? Et quelles commandes utilisez-vous pour exécuter avec docker et docker-compose?
@plumSemPy oui, je peux voir les deux start-ups du printemps. J'ajoute des parties du journal. Pour les exécuter, il suffit de
docker runaprèsdocker buildVeuillez consulter [ stackoverflow.com/questions/26548505/...
@Ritabrata Je ne vois pas la relation.