Docker容器访问外部MySQL主机

时间:2017-08-18 05:17:48

标签: spring docker spring-boot dockerfile amazon-ecs

我在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)。

3 个答案:

答案 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

如果我只是清楚地关注错误信息并理解它所说的话,我就不会浪费每个人的时间。