Spring Boot + docker-compose + MySQL: соединение отказано - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь настроить приложение весенней загрузки, которое зависит от базы данных MySQL с именем teste в docker-compose. После выдачи docker-compose up я получаю:

Caused by: java.net.ConnectException: Connection refused (Connection refused)

Я работаю на Linux Mint, моя версия docker-compose - 1.23.2 , моя версия docker - 18.09.0 .

application.properties

# JPA PROPS
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.datasource.url=jdbc:mysql://db:3306/teste?useSSL=false&serverTimezone=UTC
spring.datasource.username=rafael
spring.datasource.password=password

spring.database.driverClassName =com.mysql.cj.jdbc.Driver

докер-compose.yml

version: '3.5'
services:
  db:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=teste      
      - MYSQL_USER=rafael
      - MYSQL_PASSWORD=password
    ports:
      - 3306:3306
  web:
    image: spring-mysql
    depends_on:
      - db
    links:
      - db
    ports:
      - 8080:8080
    environment:
      - DATABASE_HOST=db
      - DATABASE_USER=rafael
      - DATABASE_NAME=teste
      - DATABASE_PORT=3306

и Dockerfile

FROM openjdk:8
ADD target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Спасибо заранее!

Ответы [ 2 ]

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

Docker compose всегда запускает и останавливает контейнеры в порядке следования или в последовательном порядке в файле, если не указан. Но docker-compose не гарантирует, что будет ждать запуска контейнера зависимостей. Вы можете см. здесь для получения более подробной информации. Поэтому проблема в том, что ваша база данных не готова, когда ваш контейнер spring-mysql пытается получить доступ к базе данных. Поэтому рекомендуемое решение: вы можете использовать wait-for-it.sh или аналогичный скрипт для переноса приложения spring-mysql, запускающего ENTRYPOINT.

Например, если вы используете wait-for-it.sh, ваш ENTRYPOINT в вашем Dockerfile должен измениться на следующий после копирования сценария в корневой каталог вашего проекта:

ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]

И еще две важные вещи, которые следует учитывать здесь:

  • Не используйте ссылки, которые устарели Вы должны использовать вместо этого пользовательскую сеть. Все сервисы в файле docker-compose будут находиться в одной определяемой пользователем сети, если вы явно не определяете какую-либо сеть. Так что вам просто нужно удалить ссылки из файла создания.
  • Вам не нужно публиковать порт для контейнера Docker, если вы используете его только в определенной пользователем сети.
0 голосов
/ 11 января 2019

Ваш конфиг выглядит хорошо, я бы просто порекомендовал:

  • Удалить links: db. Это не имеет значения в user-defined bridge сети
  • Удалите доступ к портам для базы данных, если вы не хотите подключаться извне docker-compose - все порты автоматически открываются в сети user-defined bridge.

Я думаю, проблема в том, что запуск контейнера базы данных занимает больше времени, чем веб. depends_on просто контролирует порядок, но не гарантирует готовность базы данных. Если возможно, установите несколько попыток подключения или поместите процедуру ожидания сокета в свой веб-контейнер.

...