I am trying to run a springboot microservice docker image. It fetches the DB connection properties from a Config server. However it is unable to connect to the container.
Error :
JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : 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.
Exception :
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
Caused by :
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_242]
2020-09-28 11:39:32.782 [ : ] WARN [task-1] o.h.e.j.s.SqlExceptionHelper - SQL Error: 0, SQLState: 08S01
1 --- [ task-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08S01
2020-09-28 11:39:32.791 [ : ] ERROR [task-1] o.h.e.j.s.SqlExceptionHelper - 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 --- [ task-1] o.h.engine.jdbc.spi.SqlExceptionHelper : 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.
Properties located at Config Server
shopping-service.datasource.url: jdbc:mysql://A.B.C.D:3306/shoppingCartDB
shopping-service.datasource.username: root
shopping-service.datasource.password: root
A.B.C.D
is my docker host IP.
application.yaml
datasource:
url: ${shopping-service.datasource.url}
username: ${shopping-service.datasource.username}
password: ${shopping-service.datasource.password}
#driver-class-name: com.mysql.jdbc.Driver
jpa:
generate-ddl: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
show_sql: true
ddl-auto: create-drop
profiles:
active: dev
I have pulled the MySQL 8.0 docker image from docker hub.
docker pull mysql/mysql-server:8.0
docker run --name=mysql-container -d mysql/mysql-server:8.0
Changed the password to "root".
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.02 sec)
Created the database :
mysql> create DATABASE shoppingCartDB;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Docker RUN
docker run -p 5000:5000 shoppingms:latest --env shopping-service.configserverurl=http://A.B.C.D:8888 --env shopping-service.eureka.url=http://A.B.C.D:4444/eureka
It is able to fetch the properties from config server. I checked the logs. Error came from this line :
com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
In my local environment I am able to use the locally installed MySQL Db with the same connection parameters. However in docker I am getting the exceptions. Where I am going wrong can anyone please help me out.
UPDATE :
After exposing the MySQL container to port 3306, the error stands at now :
2020-09-28 12:07:43.942 [ : ] WARN [task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : null, message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
1 --- [ task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata : null, message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
2020-09-28 12:07:49.219 [ : ] WARN [task-1] o.h.e.j.s.SqlExceptionHelper - SQL Error: 1130, SQLState: HY000
1 --- [ task-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1130, SQLState: HY000
2020-09-28 12:07:49.225 [ : ] ERROR [task-1] o.h.e.j.s.SqlExceptionHelper - null, message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
1 --- [ task-1] o.h.engine.jdbc.spi.SqlExceptionHelper : null, message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
Able to resolve the issue now.
1. Identify the ip address from docker inspect command.
2. Create an user for that ip.
3. Need to alter the new user password.
4. Grant some privileges to the user.
5. Exit
Now run your container again, this time it could obtain the connections and successfully create the tables.