Below is my docker-compose file and my application.yml file. I am overriding the mysql jdbc url in the docker-compose file.
Why i run via the command line I am able to connect to the database running on docker instance.
mysql -uroot -proot -h127.0.0.1 -P3309
When I execute docker-compose up, i am getting the below error. Spring boot docker instance is not able to connect to the docker instance of mysqldb. Can you please help me understand what could be the issue?
reco-tracker-docker_1 | Caused by: java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, "jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
reco-tracker-docker_1 | at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1 | at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:331) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1 | at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:114) ~[HikariCP-4.0.3.jar!/:na]
docker-compose.yml
version: '3.8'
services:
mysqldb-docker:
image: 'mysql:8.0.27'
restart: 'unless-stopped'
ports:
- "3309:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=reco-tracker-dev
env_file:
- ./.env
volumes:
- mysqldb:/var/lib/mysql
reco-tracker-docker:
image: 'reco-tracker-docker:latest'
ports:
- "8083:8083"
environment:
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
depends_on: [mysqldb-docker]
volumes:
mysqldb:
application.yml
server:
port: 8083
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/reco-tracker
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
generate-ddl: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
Post my discussion in the comments section with [@the-fool],
IT WORKS NOW!!!
server:
port: 8083
spring:
datasource:
username: root
password: root
url: ${SPRING_DATASOURCE_URL}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
generate-ddl: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
FROM openjdk:17
ARG JAR_FILE="*.jar"
COPY target/${JAR_FILE} reco-tracker.jar
EXPOSE 8083
ENTRYPOINT ["java", "-jar","reco-tracker.jar"]
version: '3.8'
services:
mysqldb-docker:
image: 'mysql:8.0.27'
restart: 'unless-stopped'
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=reco-tracker
volumes:
- mysqldb:/var/lib/mysql
reco-tracker-docker:
image: 'reco-tracker-app:v2'
ports:
- "8083:8083"
environment:
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb-docker:3306/reco-tracker
depends_on: [mysqldb-docker]
volumes:
mysqldb:
Have you tried docker "networks" here? If not, then create one network and run the container in same networks.
in yaml, something like:
networks:
-myNet
Your problem is that you are trying to access the DB on the published port. You are using 3009 of the mapping 3309:3306. This does not work. You cannot change the port of a container inside the network. You need to use 3306 if you want to connect over the docker network. 3309 is only available from the host system.
At least in this part it seems to be wrong. (It also seems there could be an issue with the double quotes, I would quote the full string or not all.)
environment:
- SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
In your spring config you are using the right port but there you are using localhost as db host, which also seems wrong.
spring:
datasource:
url: jdbc:mysql://localhost:3306/reco-tracker
I don't know java much, so I cannot tell you how it would behave. If the former env var will overwrite this. But as it stands, both settings are slightly incorrect.
I can imagine that you could fix it by doing something like this.
environment:
# fix the port here
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb-docker:3306/reco-tracker-dev
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root
spring:
datasource:
# Use the env vars in the spring config
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
Also make sure that your database namings are consistent. They seem a bit inconsistent in your post. Keep in mind that the name was used the first time the mysql container was started, is stored in the volume. So either use the name you have used at that point in time, or delete the volume to let it create a new database, which will cause you to lose the stored data. So be careful what option you choose.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.