首页 文章

Docker容器访问外部MySQL主机

提问于
浏览
0

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

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

Spring 季启动应用程序失败抱怨用户 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 回答

  • 1

    你需要设置两者

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

    如指定here

  • 1

    最后想出了问题,这是我的数据库用户权限的问题 . 事实证明我的mysql用户权限存在问题 . 这不是docker或springboot的问题 .

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

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

  • 2

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

相关问题