【问题标题】:Docker container accessing external MySQL hostDocker 容器访问外部 MySQL 主机
【发布时间】:2018-01-26 16:31:53
【问题描述】:

我在 EC2 实例 (EC2_IP) 中设置了一个 spring-boot docker 容器,并且我在另一个 VM 中托管了一个 MySQL。我验证了可以从托管 docker 容器的 EC2 实例访问 mysql 主机(MYSQL_IP)。

我在 docker run 期间使用 docker 环境变量传递 spring.datasource.url 参数。

Spring Boot 应用程序失败并显示错误消息拒绝用户 db_user@EC2_IP 访问。这是我无法理解和修复的部分。我不明白为什么它试图连接到 EC2_IP 而不是 db_user@MYSQL_IP

我做了一个 docker 检查,我验证了 spring.datasoure.url 的环境变量传递正确,它是 db_user@MYSQL_IP:3306。

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

为了根据cmets进行澄清,我已经正确配置了数据源。

在 docker inspect 内部,Args 的值:

-Dspring.datasource.url=jdbc:mysql://MYSQL_IP:3306/test

另外,我检查了我是否传递了一些无效的 IP(例如)一些随机文本,然后它会抛出一个错误,指出主机无效(这确认,它正在使用我传入的主机)。但是,如果我配置为外部 IP,它似乎会解析为主机 IP 地址 (EC2_IP)。

【问题讨论】:

  • 你能进入你的 sprint-boot docker 容器并执行 telnet sqlhost 3306 吗?
  • spring.datasource.url 看起来像什么,密码和用户被屏蔽了?

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


【解决方案1】:

两者都需要设置

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

如指定here

【讨论】:

    【解决方案2】:

    终于解决了问题,是我的数据库用户权限的问题。 原来是我的mysql用户权限有问题。这不是 docker 或 springboot 的问题。

    Access denied for user 'test'@'localhost' (using password: YES) except root user

    如果我能清楚地关注错误信息并理解它所说的内容,我就不会浪费大家的时间了。

    【讨论】:

    • 我也有同样的问题,你能说出哪个确切的答案解决了你的问题吗?
    【解决方案3】:

    问题似乎出在 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2021-05-25
      • 2020-02-17
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多