2
respostas

Docker Java + Spring boot + Mysql

version: "3"
services:
  springboot:
    build:
      context: ./
      dockerfile: ./Dockerfile
    image: springboot
    networks:
      - spring
    ports:
      - "8081:8081"
      - "5005:5005"
    volumes:
      - "./springboot:/home/spring_curso"
    environment:
      - ADDITIONAL_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx1G -Xms128m -XX:MaxMetaspaceSize=128m
      - PROFILE=dev

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: senha
    networks:
      - spring
    ports:
      - 33060:3306
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
    networks:
      - spring
networks:
  spring:
    driver: bridge

o problema que ocorre e que quando dou o docker-compose up --build --force-recreate ele criar o db, adminer e executa e fica online mas quando chega no springboot e não consegue logar no mysql, alguem já teve esse problema, ou sabem de alguma alternativa?

spring.datasource.url=jdbc:mysql://localhost:3306/spring
spring.datasource.username=root
spring.datasource.password=senha
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
2 respostas

Opa Julio, tudo bem?

Acredito que o seu problema seja o tempo que o mysql leva para "ficar pronto". O que quero dizer é, o container dele sobe bem rápido, mas o serviço do mysql em si leva um tempo até ficar realmente disponível. Se for mesmo esse o problema, você pode usar o dockerize (https://github.com/jwilder/dockerize). Na página tem certinho o esquema de instalar, mas basicamente é colocar as instruções no dockerfile do seu springboot e atualizar o entrypoint colocando antes da chamada do app o seguinte: dockerize -wait tcp://db:33060 -timeout 40s <aqui vai o entrypoint original> Você precisa também informar para o dockercompose a ordem de subida dos containers. Para isso, inclua a instrução "depends_on" no seu arquivo:

services:
  springboot:
  ...
    depends_on:
      - db  

Olá Julio, tudo bem? Acho que posso contribuir com a resposta do João Vitor, bem realmente acho que esse é o ponto, um container só pode subir após o outro está totalmente pronto, e nesse caso é preciso que o MySQL esteja OK para que possamos utilizá-lo no container do Spring boot, e também tem a questão que precisamos do endereço do container MySQL que na verdade não deve ser localhost. Espero ter ajudado!