spring - 无法使用Docker部署Spring和MySQL应用程序

标签 spring docker docker-compose dockerfile mysql-connector

我试图将Spring服务器连接到均在不同容器中运行的Mysql数据库,但出现此错误:

Caused by: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_232]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_232]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_232]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_232]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:162) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.<init>(ConnectionUrlParser.java:136) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:118) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrl.getConnectionUrlInstance(ConnectionUrl.java:197) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:196) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        ... 53 common frames omitted

对于Mysql容器,我正在使用dockerhub中的最新镜像。
我猜测我尝试连接的mysql容器的IP地址是错误的,但是我不知道如何获取正确的地址。

我通过以下方式启动mysql容器:
docker run -p 3036:3036 --name mysql-container -d mysql

Spring项目中的application.properties:
database.ip = ${MYSQL_IP:mysql-container}
database.port = ${MYSQL_PORT:3306}
spring.datasource.url = jdbc:mysql://${database.ip}:${database.port}/${database.name}

后端容器:
docker run -p 8080:8080 --name backend_container --link mysql-container:mysql -d backend_container

直到现在我还没有使用Docker,如果这是一个琐碎/无聊的问题,请对不起。

我将不胜感激! :)

最佳答案

首先,我不明白为什么要对数据库进行容器化。一般来说,没有任何理由。

检查数据库主机是否具有端口转发功能,即数据库主机上的端口3036应该映射到URL或全局IP地址。 checkout ngrok,以使您不受阻碍,但是通常有一种“适当的”方式来执行此操作,该方法通常特定于您的云提供商。

编辑:您发布的代码中还有一个错字。您的docker run命令使用端口3036,但是您的Spring代码包含database.port = ${MYSQL_PORT:3306}。无法确定这只是此处或实际代码中的错字,但也可能在那里。

关于spring - 无法使用Docker部署Spring和MySQL应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535599/

相关文章:

java - 使用 Spring MVC 的可配置 Comet servlet

java - 为什么我在使用Junit测试Class时在第二种方法中得到 “null point error”?

java - 将 PROPAGATION_REQUIRED_NEW 与两个单独的 spring bean 一起使用时的 Oracle 数据库锁定

docker - 如何在容器中记录http请求和时间成本?

mysql - Mac 上的 Docker : Unable to run MySQL

java - 如何在 Spring Webflux 中将 java.time.Instant 序列化为 ISO 字符串

node.js - 即使Ghost/Node处于开发模式,刷新浏览器后,为什么我的官方Ghost.org Docker容器仍可提供旧内容?

docker - 无法让 Docker 之外的 Docker 与 ECS 中的 Jenkins 一起工作

amazon-web-services - 使用 docker compose 在 Amazon ECS 上部署应用程序

amazon-web-services - 带有 Docker 容器的 AWS Cloudwatch 日志 - NoCredentialProviders : no valid providers in chain