I'm encountering an access denied error when trying to connect to MySQL from my Spring Boot application. Here's the relevant part of the error log:
SQL Error: 1045, SQLState: 28000
Access denied for user 'RoadHaulageUser'@'172.18.0.3' (using password: YES)
app-1 | 2025-02-19T12:40:13.593Z ERROR 202 --- [RoadHaulage] [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
app-1 | 2025-02-19T12:40:13.595Z WARN 202 --- [RoadHaulage] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: .springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested s
ervice [.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
app-1 | 2025-02-19T12:40:13.599Z INFO 202 --- [RoadHaulage] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
app-1 | 2025-02-19T12:40:13.614Z INFO 202 --- [RoadHaulage] [ main] .s.b.a.l.ConditionEvaluationReportLogger :
app-1 |
app-1 | Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
app-1 | 2025-02-19T12:40:13.633Z ERROR 202 --- [RoadHaulage] [ main] o.s.boot.SpringApplication : Application run failed
FROM openjdk:23-jdk-slim
WORKDIR /app
COPY build.gradle settings.gradle ./
COPY gradlew ./
COPY gradle ./gradle
COPY src ./src
COPY document ./document
COPY db ./db
RUN ./gradlew build --no-daemon
CMD ["./gradlew", "bootRun"]
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
SPRING_APPLICATION_NAME: RoadHaulage
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/${MYSQL_DB_NAME}
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER_NAME}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_USER_PASSWORD}
SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.cj.jdbc.Driver
SPRING_JPA_PROPERTIES_HIBERNATE_FORMAT_SQL: false
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_SHOW_SQL: true
SPRING_JPA_OPEN_IN_VIEW: false
SPRING_MAIL_HOST: smtp.gmail
SPRING_MAIL_PORT: 587
SPRING_MAIL_USERNAME: ${EMAIL_USERNAME}
SPRING_MAIL_PASSWORD: ${EMAIL_PASSWORD}
SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH: true
SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE: true
SERVER_PORT: 8080
depends_on:
- db
env_file:
- .env
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DB_NAME}
MYSQL_USER: ${MYSQL_USER_NAME}
MYSQL_PASSWORD: ${MYSQL_USER_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
mysql_data:
spring:
application:
name: RoadHaulage
datasource:
url: jdbc:mysql://db:3306/${MYSQL_DB_NAME}
username: ${MYSQL_USER_NAME}
password: ${MYSQL_USER_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
format-sql: false
hibernate:
ddl-auto: update
show-sql: true
open-in-view: false
mail:
host: smtp.gmail
port: 587
username: ${EMAIL_USERNAME}
password: ${EMAIL_PASSWORD}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
server:
port: 8080
CREATE DATABASE IF NOT EXISTS dbname;
CREATE USER IF NOT EXISTS 'dbuser'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;
File structure
Checked Configuration: I verified that the environment variables in my .env file are correctly set with the right credentials (MYSQL_DB_NAME, MYSQL_USER_NAME, MYSQL_USER_PASSWORD). I expected this would allow my application to connect to the MySQL database without any access issues.