在 SpringBoot 中使用 MySQL 运行 docker-compose:数据库未连接到 Spring 应用程序
P粉323224129
P粉323224129 2023-08-30 12:33:00
[MySQL讨论组]
<p>我在 SpringBoot 中有一个微服务(产品服务),在 MySQL 中有一个数据库,并且希望在 Docker 中运行我的应用程序</p> <p>我可以在本地运行该服务,没有任何错误。但是当我启动 Docker (docker-compose up --build) 时,它显示了一些连接错误。</p> <p>我在 application.properties、Dockerfile、docker-compose、pom.xml 和错误中显示了我的代码。经过一番修改和询问朋友,错误依然存在。如果有人能帮助我,我将不胜感激:)</p> <p>在 MySQL Workbench 中,我设置了一个与 URL <code>localhost:3306</code> 的连接,并在其中创建了一个 <code>testdb</code> 模式。</p> <p>这是我的<code>application.properties</code></p> <pre class="brush:php;toolbar:false;">spring.datasource.url= jdbc:mysql://localhost:3306/testdb spring.datasource.username= abc spring.datasource.password= def spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect #Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto= update</pre> <p>这是 Dockerfile</p> <pre class="brush:php;toolbar:false;">FROM maven:3.8.3-openjdk-17 AS build WORKDIR /app COPY mvnw . COPY .mvn .mvn COPY pom.xml . COPY src src RUN mvn install -DskipTests RUN mkdir -p target/dependency &amp;&amp; (cd target/dependency; jar -xf ../*.jar) FROM openjdk:17-jdk-slim VOLUME /tmp ARG DEPENDENCY=/app/target/dependency COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT [&quot;java&quot;,&quot;-cp&quot;,&quot;app:app/lib/*&quot;,&quot;com.example.helloworld.EcommerceApplication&quot;] EXPOSE 8080</pre> <p>这是 docker-compose.yml</p> <pre class="lang-yaml prettyprint-override"><code>version: &quot;3.9&quot; services: product-service: container_name: product-service build: context: . dockerfile: Dockerfile links: - database depends_on: - database environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/testdb #- SPRING_DATASOURCE_USERNAME=abc #- SPRING_DATASOURCE_PASSWORD=def - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect - SPRING_JPA_HIBERNATE_DDL-AUTO=update - SPRING_JPA_SHOW-SQL= true ports: - 8080:8080 networks: - internal database: platform: linux/x86_64 image: mysql:8.0 container_name: mysql #ports: # - &quot;3306:3307&quot; environment: MYSQL_DATABASE: testdb MYSQL_ROOT_USER: abc MYSQL_ROOT_PASSWORD: def networks: - internal networks: internal: name: internal </code></pre> <p>这是我在 pom.xml 中的依赖项</p> <pre class="lang-xml prettyprint-override"><code> &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;mysql&lt;/groupId&gt; &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;version&gt;8.0.30&lt;/version&gt; &lt;scope&gt;runtime&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.projectlombok&lt;/groupId&gt; &lt;artifactId&gt;lombok&lt;/artifactId&gt; &lt;version&gt;1.18.24&lt;/version&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt; &lt;version&gt;6.0.5&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springdoc&lt;/groupId&gt; &lt;artifactId&gt;springdoc-openapi-ui&lt;/artifactId&gt; &lt;version&gt;1.6.12&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-validation&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.h2database&lt;/groupId&gt; &lt;artifactId&gt;h2&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;junit&lt;/groupId&gt; &lt;artifactId&gt;junit&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate.validator&lt;/groupId&gt; &lt;artifactId&gt;hibernate-validator&lt;/artifactId&gt; &lt;version&gt;8.0.0.Final&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt; &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt; &lt;version&gt;2.3.1&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.javassist&lt;/groupId&gt; &lt;artifactId&gt;javassist&lt;/artifactId&gt; &lt;version&gt;3.25.0-GA&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; </code></pre> <p>我总结了这些代码中的错误</p> <p><code>产品服务 |引起原因:com.mysql.cj.exceptions.CJCommunicationsException:通信链路故障</code></p> <pre class="brush:php;toolbar:false;">`product-service | Caused by: java.net.ConnectException: Connection refused` `product-service | 2023-03-14 08:45:26.585 WARN 1 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a utoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution` `product-service | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/b oot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution` `product-service | Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution ` `product-service | Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution ` `product-service | 2023-03-14 08:50:17.188 ERROR 1 --- [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution ` `product-service | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. `</pre> <p>产品服务 | ...省略52个常见框架</p>
P粉323224129
P粉323224129

全部回复(1)
P粉722409996

在 docker-compose 文件中,您的数据库容器被命名为database,并且在网络中访问此容器时应使用相同的名称作为主机名

spring.datasource.url= jdbc:mysql://database:3306/testdb
and
SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/testdb

而不是

spring.datasource.url= jdbc:mysql://localhost:3306/testdb
and 
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/testdb
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号