Docker容器访问外部MySQL主机

我已经在EC2实例(EC2_IP)中设置了一个spring-boot docker容器,而且我有一个托pipe在不同虚拟机中的MySQL。 我validation了可以从托pipedocker容器的EC2实例访问mysql主机(MYSQL_IP)。

我在docker运行期间使用docker环境variables传递spring.datasource.url参数。

春季启动应用程序无法向用户db_user @ EC2_IP拒绝错误消息访问。 这是我无法理解和修复的部分。 我不明白为什么它试图连接到EC2_IP而不是db_user @ MYSQL_IP

我做了一个docker检查,并validationspring.datasoure.url的环境variables正确传递,它是db_user @ MYSQL_IP:3306。

我花了几个小时试图解决这个问题,但没有运气。 任何帮助表示赞赏。

要根据评论澄清,我已经正确configuration了数据源。

在docker检查里面,Args的价值:

-Dspring.datasource.url = JDBC:MySQL的:// MYSQL_IP:3306 /testing

此外,我检查是否通过一些无效的IP(例如)一些随机的文本,然后它会抛出一个错误,说主机是无效的(这证实,它是采取主机,我通过)。 但是,如果我configuration为外部IP,它似乎parsing为主机IP地址(EC2_IP)。

你需要设置两个

 spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass 

如此处所述

最后想出了这个问题,这是我的数据库用户权限问题。 原来是我的MySQL用户权限的问题。 docker或跳板不是问题。

除root用户外,拒绝用户“test”@“localhost”(使用密码:YES)的访问

如果我只把注意力集中在错误信息上,理解它所说的话,我就不会浪费每个人的时间。

这个问题似乎在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 

作为参考,请查看这里的官方文档 。

类似的工作scheme是:

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运行时:

 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'