Запускать несколько приложений Spring-Boot с помощью Docker-Compose - PullRequest
0 голосов
/ 04 января 2019

У меня есть два приложения Spring, которые используют одну и ту же базу данных Mysql. Они отлично работают, когда я запускаю их без docker-compose. Мой компьютер - Windows 10 Professional.

application.properties

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

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"]

Я создал этот docker-compose.yml на основе других примеров.

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: {}

Это не работает. После запуска работает только контейнер Mysql.

Вот часть вывода с журналами Spring

solver_1 | 2019-01-04 22: 55: 15.698 WARN 1 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper: ошибка SQL: 0, состояние SQLState: 08S01 solver_1 | 2019-01-04 22: 55: 15.698 ОШИБКА 1 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper: сбой линии связи solver_1 | solver_1 | Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера.

Что мне не хватает в конфигурации? application.properties игнорируются при работе с композитингом?

Ответы [ 3 ]

0 голосов
/ 05 января 2019

В итоге я смог запустить приложение.

Вот настройки

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

докер-compose.yml

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: {}
0 голосов
/ 24 февраля 2019

Вместо жесткого кодирования строки источника данных MySQL в вашем application.properties вы можете передать ее из конфигурации docker-compose. Более того, вы используете имя службы «база данных», определенное в docker-compose, для создания жестко запрограммированной записи в вашем application.properties.

Избегайте этого, сделайте что-то вроде ниже:

   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: {}

Примечание. Любые общие свойства приложения Spring Boot можно преобразовать в переменную среды, заменив точку (.) Подчеркиванием (_)

0 голосов
/ 04 января 2019

Приложения Spring-Boot пытаются подключиться к localhost: 3306. Это работает нормально, если они не работают внутри контейнера.

При работе в контейнере также пытаются установить соединение с локальным узлом (но на этот раз в контейнере с подпружиненной загрузкой). Это терпит неудачу, очевидно, поскольку в вашем контейнере с загрузочной пружиной не работает mysql.

Служба mysql доступна в сети докеров по псевдониму (база данных).

Переконфигурируйте ваш spring.datasource.url для

spring.datasource.url=jdbc:mysql://database:3306/webDatabase?autoReconnect=true&useSSL=false

Это можно сделать либо внутри вашего application.properties, либо с помощью переменных среды в вашем файле docker-compose.

...