1
votes

Exécutez plusieurs applications Spring-Boot avec Docker-Compose

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?


4 commentaires

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 run après docker build


Veuillez consulter [ stackoverflow.com/questions/26548505/...


@Ritabrata Je ne vois pas la relation.


3 Réponses :


2
votes

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>


3 commentaires

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



1
votes

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


0 commentaires

1
votes

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 ( _)


0 commentaires