Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Container Spring Boot não se comunica com container de imagem mysql

Olá

Eu criei um container com uma imagem que eu havia buildado através do comando "docker build -t trs-back ." de um projeto spring boot. A imagem é criada normalmente, mas quanto tento subir o container com o comando "docker run -p 5000:5000 trs-back" ele não incializa o tomcat devido a um problema de comunicação com o container do mysql.

Obs: Rodando na minha máquina o projeto acessa o container do mysql normalmente

Dockerfile do projeto spring boot:

FROM openjdk:11
COPY target/trs-0.0.1-SNAPSHOT.jar /app/trs-0.0.1-SNAPSHOT.jar
WORKDIR /app
RUN apt-get install mysql\*
EXPOSE 5000
CMD ["java", "-jar", "trs-0.0.1-SNAPSHOT.jar"]

application.properties do projeto spring boot

spring.datasource.url=jdbc:mysql://localhost:3306/TRS
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=validate

#port
server.port=5000

Erro ao subir o container:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:732) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:664) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:479) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]

4 respostas

O erro que você está enfrentando indica um problema de comunicação entre o contêiner da sua aplicação Spring Boot e o contêiner do MySQL. Isso ocorre porque o seu aplicativo Spring Boot está configurado para se conectar ao MySQL no host "localhost", o que não funcionará quando executado em contêineres separados.

Para resolver esse problema, você deve configurar a conexão do aplicativo Spring Boot para usar o nome do contêiner do MySQL como o host em vez de "localhost". Em um ambiente de contêiner, você pode usar o nome do serviço do contêiner como o host para permitir a comunicação entre contêineres.

Aqui estão os passos para corrigir a configuração:

  1. Atualize o arquivo application.properties do seu projeto Spring Boot para configurar a conexão com o MySQL usando o nome do serviço do contêiner. Você pode usar o nome do serviço padrão do MySQL que é mysql.
spring.datasource.url=jdbc:mysql://mysql:3306/TRS
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=validate
  1. Certifique-se de que seus contêineres estejam na mesma rede Docker para que possam se comunicar entre si. Você pode criar uma rede Docker personalizada ou usar a rede padrão. Por exemplo, você pode criar uma rede personalizada com o seguinte comando:
docker network create mynetwork
  1. Ao executar seus contêineres, adicione a opção --network para conectá-los à mesma rede:
docker run -p 5000:5000 --network=mynetwork --name trs-back trs-back
docker run -p 3306:3306 --network=mynetwork --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=TRS mysql:latest

Isso permitirá que o contêiner da sua aplicação Spring Boot se comunique com o contêiner do MySQL usando o nome do serviço mysql como o host.

Lembre-se de substituir mynetwork pelo nome da rede que você está usando, se você escolher uma rede personalizada diferente.

Com essas alterações, a comunicação entre seus contêineres deve funcionar corretamente. Certifique-se de que o contêiner do MySQL esteja em execução antes de iniciar o contêiner da sua aplicação Spring Boot.

Olá estudante.

Obrigado pelo retorno.

Fiz as mudanças que você propôs. Criei uma network chamada "trsnetwork" e subi o container do mysql rodando nela. Isso deu certo!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

buildei a imagem novamente e tentei subir o container do spring boot usando o comando "docker run -p 5000:5000 --network=trsnetwork --name trs-back trs-back", mas ocorreu o mesmo erro.

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:732) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:664) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:479) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) ~[tomcat-jdbc-8.5.11.jar!/:na]
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]
  • Qual o comando que você está digitando para subir o container do DB?
  • Se você entrar no bash do container gerado com a imagem trs-back e pingar o container do DB recebe retorno?
  • Qual o valor da propriedade 'spring.datasource.url' no seu application.properties dentro do container Spring gerado com a imagem trs-back?
solução!

Consegui resolver o problema fazendo a comunicação entre os container por IP. Alterei a url do mysql no properties para "spring.datasource.url=jdbc:mysql://172.20.0.2:3306/TRS" por exemplo. Vou melhorar essa solução mesmo porque quando os containers são parados e reiniciados, o ip muda, mas por hora deu certo.

Obrigado pela força galera!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software