我在EC2实例(EC2_IP)中设置了一个spring-boot docker容器,并且我在另一个VM中托管了一个MySQL。我验证了mysql主机(MYSQL_IP)可以从托管docker容器的EC2实例访问。
我在docker run期间使用docker环境变量传递spring.datasource.url参数。
春季启动应用程序无法抱怨用户 db_user @ EC2_IP 的错误消息访问被拒绝。这是我无法理解和解决的部分。我不明白为什么它试图连接到EC2_IP而不是 db_user @ MYSQL_IP 。
我做了一个docker inspect,我验证了spring.datasoure.url的环境变量是否正确传递,它是db_user @ MYSQL_IP:3306。
我花了好几个小时试图解决这个问题,但没有运气。任何帮助表示赞赏。
根据评论澄清,我正确配置了数据源。
在docker中,检查Args的值:
-Dspring.datasource.url = JDBC:MySQL的:// MYSQL_IP:3306 /测试
另外,我检查了是否传递了一些无效的IP(例如)一些随机文本,然后它抛出一个错误,说主机无效(这确认了,它正在接收我传入的主机)。但是,如果我配置为外部IP,它似乎解析为主机IP地址(EC2_IP)。
答案 0 :(得分:2)
您需要同时设置
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
指定here
答案 1 :(得分:1)
问题似乎在spring.datasource.url;它不应该是格式:
db_user@db_host:port
而不是:
driver_class:db_type://db_host:db_port/db_name
例如:
jdbc\:mysql\://localhost\:3306/test
注意每个冒号之前的转义反斜杠\:。
如果使用默认的mysql端口,则可以省略:3306 部分:
jdbc\:mysql\://localhost/test
供参考,请查看official documentation here。
类似的工作场景是:
1-在application.properties中:
spring.datasource.url=jdbc\:mysql\://${DATABASE_HOST}\:${DATABASE_PORT}/${DATABASE_NAME}
spring.datasource.name=${DATABASE_USER}
spring.datasource.password=${DATABASE_PASSWORD}
2-运行docker run时运行:
docker run -p 8080:8080 image_name_or_id \
-e DATABASE_HOST='MYSQL_IP' \
-e DATABASE_USER='db_user' \
-e DATABASE_PASSWORD='db_pass_for_db_user' \
-e DATABASE_NAME='db_name' \
-e DATABASE_PORT='3306'
答案 2 :(得分:1)
最后想出了问题,这是我的数据库用户权限的问题。 事实证明我的mysql用户权限存在问题。这不是docker或springboot的问题。
Access denied for user 'test'@'localhost' (using password: YES) except root user
如果我只是清楚地关注错误信息并理解它所说的话,我就不会浪费每个人的时间。