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

[ERRO] Access denied for user 'root'@'172.20.0.3' (using password: YES)

Forma de reproduzir: Ao emitir o comando docker compose up --build

Resultado:

SQL State  : 28000
Error Code : 1045
Message    : Access denied for user 'root'@'172.20.0.3' (using password: YES)

Mais detalhes:

Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: Access denied for user 'root'@'172.20.0.3' (using password: YES)
app-1    | -----------------------------------------------------------------------------------------------------------
app-1    | SQL State  : 28000
app-1    | Error Code : 1045
app-1    | Message    : Access denied for user 'root'@'172.20.0.3' (using password: YES)
app-1    |
app-1    | 	at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:60) ~[flyway-core-10.10.0.jar:na]
app-1    | 	at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:72) ~[flyway-core-10.10.0.jar:na]
app-1    | 	at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:134) ~[flyway-core-10.10.0.jar:na]
app-1    | 	at org.flywaydb.core.Flyway.migrate(Flyway.java:147) ~[flyway-core-10.10.0.jar:na]
app-1    | 	at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-3.3.1.jar:3.3.1]
app-1    | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) ~[spring-beans-6.1.10.jar:6.1.10]
app-1    | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-6.1.10.jar:6.1.10]
app-1    | 	... 94 common frames omitted
app-1    | Caused by: java.sql.SQLException: Access denied for user 'root'@'172.20.0.3' (using password: YES)
app-1    | 	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189) ~[mysql-connector-j-8.3.0.jar:8.3.0]
app-1    | 	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:48) ~[flyway-core-10.10.0.jar:na]
app-1    | 	... 100 common frames omitted
app-1    |
app-1 exited with code 1

app.env

SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/codechella_db
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=pa55word
MAIL_HOST=smtp.gmail.com
MAIL_USER=testings.boot@gmail.com
MAIL_PASSWORD=khcraohk
APP_JWT_SECRET=jwt_secret

mysql.env

MYSQL_RANDOM_ROOT_PASSWORD=true
MYSQL_DATABASE=codechella_db
MYSQL_USER=root
MYSQL_PASSWORD=pa55word

Questões adicionais:

  1. Porquê a excepção FlywaySqlException uma vez que estou a trabalhar com o banco de dados MySQL?
  2. Porquê preciso criar um User Root com uma senha aleatória (MYSQL_RANDOM_ROOT_PASSWORD=true) se eu já estou a criar explicitamente um user?
10 respostas

Oi!

Ocorre erro FlywaySqlException, pois o flyway tenta rodar as migrations do projeto no MySQL, mas não consegue se conectar no banco com os dados informados.

Nos seus arquivos .env não utilize o usuário root no banco de dados e sim outro. Exemplo:

SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/codechella_db
SPRING_DATASOURCE_USERNAME=codechella_user
SPRING_DATASOURCE_PASSWORD=pa55word
MAIL_HOST=smtp.gmail.com
MAIL_USER=testings.boot@gmail.com
MAIL_PASSWORD=khcraohk
APP_JWT_SECRET=jwt_secret
MYSQL_RANDOM_ROOT_PASSWORD=true
MYSQL_DATABASE=codechella_db
MYSQL_USER=codechella_user
MYSQL_PASSWORD=pa55word

Obrigado Rodrigo.

Tentei trocar o user, mas o erro prevalece:

SQL State  : 28000
Error Code : 1045
Message    : Access denied for user 'codechella_user'@'172.20.0.3' (using password: YES)

Uma dúvida: as credencias do banco de dados no container têm alguma relação com as credenciais do banco na máquina local?

São credenciais distitnas mesmo.

Mande aqui o código dos seus arquivos: application-prod.properties e docker-compose.yml

Ohh, obrigado. Envio a seguir o código dos arquivos solicitados.

application-prod.properties:

spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}

spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false

spring.mail.host=${MAIL_HOST}
spring.mail.username=${MAIL_USER}
spring.mail.password=${MAIL_PASSWORD}
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

app.security.jwt.secret=${APP_JWT_SECRET}

docker-compose.yml:

version: '3'
services:
  mysql:
    image: mysql:8.0.36
    env_file: ./env/mysql.env
    volumes:
      - ./mysql-data:/var/lib/mysql
    restart: unless-stopped
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
      interval: 5s
      timeout: 5s
      retries: 10

  app:
    build:
      context: .
    env_file: ./env/app.env
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy

volumes:
  mysql-data:

Tem estas três Excepções nos logs, acompanhando o erro Access denied for user 'root'@'172.20.0.3' (using password: YES), que podem ajudar no diagnóstico.

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usuarioRepository' defined in br.com.alura.codechella.domain.autenticacao.repository.UsuarioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaSharedEM_entityManagerFactory' while setting bean property 'entityManager'

  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: Access denied for user 'root'@'172.20.0.3' (using password: YES)

  3. org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: Access denied for user 'root'@'172.20.0.3' (using password: YES)

As configurações estão corretas.

O MySQL parece que está subindo via Docker, mas a API não consegue se conectar nele. Rode o seguinte comando no seu terminal, depois de subir o docker compose, e manda aqui um print:

docker compose ps

Tente também se conectar diretamente no mysql via terminal:

docker-compose exec mysql mysql -u codechella_user -ppa55word

Depois de emitir o docker compose up --build, enquanto a applicação tentava subir, emiti os dois comandos que propôs e os resultados foram os seguintes:

docker compose ps

NAME               IMAGE          COMMAND                  SERVICE   CREATED          STATUS                    PORTS
arquipro-app-1     arquipro-app   "java org.springfram…"   app       40 seconds ago   Up 7 seconds
arquipro-mysql-1   mysql:8.0.36   "docker-entrypoint.s…"   mysql     18 hours ago     Up 39 seconds (healthy)   3306/tcp, 33060/tcp

docker-compose exec mysql mysql -u codechella_user -p pa55word

docker-compose exec mysql mysql -u codechella_user -p pa55word
Enter password:
ERROR 1045 (28000): Access denied for user 'codechella_user'@'localhost' (using password: YES)

Após o Enter password: introduzi a mesma senha e depois foi lançado o erro 1045.

Informação adicional:

  1. Ao emitir o comando docker run e1000son/codechella:2.0, recebo a Excepção Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure:
SQL State  : 08S01
Error Code : 0
Message    : 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.
  1. Ao emitir o comando docker compose up --build, a aplicação entra no ciclo de tentativa de arranque, porém alternando entre exited with code 0 e exited with code 1, mas a interrupção ocorre com o mesmo erro:

Access denied for user 'codechella_user'@'172.20.0.3' (using password: YES)

app-1 exited with code 0

app-1    | 	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-5.1.0.jar:na]
app-1    | 	at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:48) ~[flyway-core-10.10.0.jar:na]
app-1    | 	... 100 common frames omitted
app-1    |
app-1 exited with code 0
app-1    |
app-1    |   .   ____          _            __ _ _
app-1    |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app-1    | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app-1    |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app-1    |   '  |____| .__|_| |_|_| |_\__, | / / / /
app-1    |  =========|_|==============|___/=/_/_/_/
app-1    |
app-1    |  :: Spring Boot ::                (v3.3.1)
app-1    |
app-1    | 2024-12-18T09:29:52.296Z  INFO 1 --- [           main] b.c.a.codechella.CodechellaApplication   : Starting CodechellaApplication v1.0 using Java 21.0.5 with PID 1 (/application/BOOT-INF/classes started by root in /application)
app-1    | 2024-12-18T09:29:52.302Z  INFO 1 ---

app-1 exited with code 1

app-1    | 	at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:48) ~[flyway-core-10.10.0.jar:na]
app-1    | 	... 100 common frames omitted
app-1    |
app-1 exited with code 1
app-1    |
app-1    |   .   ____          _            __ _ _
app-1    |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app-1    | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app-1    |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app-1    |   '  |____| .__|_| |_|_| |_\__, | / / / /
app-1    |  =========|_|==============|___/=/_/_/_/
app-1    |
app-1    |  :: Spring Boot ::                (v3.3.1)
app-1    |
app-1    | 2024-12-18T09:31:36.881Z  INFO 1 --- [           main] b.c.a.codechella.CodechellaApplication   : Starting CodechellaApplication v1.0 using Java 21.0.5 with PID 1 (/application/BOOT-INF/classes started by root in /application)
solução!

Parece ser algum problema no MySQL, pois nem no terminal ele aceita login com o usuario codechella_user.

Tenta então com o usuário root, alterando os arquivos .env:

mysql.env

MYSQL_ROOT_PASSWORD=pa55word
MYSQL_DATABASE=codechella_db

app.env

SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/codechella_db
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=pa55word
MAIL_HOST=smtp.gmail.com
MAIL_USER=testings.boot@gmail.com
MAIL_PASSWORD=khcraohk
APP_JWT_SECRET=jwt_secret

Altera também no docker-compose.yml a linha d o healthcheck test para:

test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD

E antes de subir o docker compose, apague a sua pasta de volume do mysql:

sudo rm -rf mysql-data

Oi Beltone,

Remova o espaço em: -ppa55word

docker-compose exec mysql mysql -u codechella_user -ppa55word

Se não funcionar, verifique as variáveis de ambiente:

docker-compose exec mysql printenv

O mais importante! Siga as instruções do Rodrigo corretamente

Boa sorte! 🍀

Muito obrigado Rodrigo e Luís. Finalmente consegui ultrapassar o problema.

Os comentários neste link também foram úteis: stackoverflow.com/mysql-docker-container-keeps-restarting