java - Spring Boot + docker-compose + MySQL:连接被拒绝
问题描述
我正在尝试设置一个 Spring Boot 应用程序,该应用程序依赖于 docker-compose 中名为teste的 MySQL 数据库。发出后docker-compose up
,我得到:
Caused by: java.net.ConnectException: Connection refused (Connection refused)
我在 Linux Mint 上运行,我的 docker-compose 版本是 1.23.2,我的 Docker 版本是 18.09.0。
应用程序属性
# JPA PROPS
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.datasource.url=jdbc:mysql://db:3306/teste?useSSL=false&serverTimezone=UTC
spring.datasource.username=rafael
spring.datasource.password=password
spring.database.driverClassName =com.mysql.cj.jdbc.Driver
码头工人-compose.yml
version: '3.5'
services:
db:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_DATABASE=teste
- MYSQL_USER=rafael
- MYSQL_PASSWORD=password
ports:
- 3306:3306
web:
image: spring-mysql
depends_on:
- db
links:
- db
ports:
- 8080:8080
environment:
- DATABASE_HOST=db
- DATABASE_USER=rafael
- DATABASE_NAME=teste
- DATABASE_PORT=3306
和 Dockerfile
FROM openjdk:8
ADD target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
解决方案
Docker compose 总是按依赖顺序启动和停止容器,如果没有给出,则在文件中按顺序启动和停止容器。但是 docker-compose 不保证它会等到依赖容器运行。您可以参考此处了解更多详情。所以这里的问题是当你的spring-mysql
容器试图访问数据库时你的数据库还没有准备好。因此,推荐的解决方案是您可以使用wait-for-it.sh或类似的脚本来包装您的spring-mysql
应用程序开始ENTRYPOINT
。
例如,如果您在 Dockerfile 中使用wait-for-it.sh
您的,则在将上述脚本复制到项目根目录后应更改为以下内容:ENTRYPOINT
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
这里要考虑的另外两个重要的事情是:
- 不要使用它们已被弃用的链接,您应该使用用户定义的网络。如果您没有明确定义任何网络,则 docker-compose 文件中的所有服务都将位于单个用户定义的网络中。所以你只需要从撰写文件中删除链接。
- 如果仅在用户定义的网络中使用 docker 容器,则无需发布端口。
推荐阅读
- flutter - 打开键盘时如何显示完整的showModalBottomSheet
- python - for循环如何处理python中的字符串值?
- mysql - 使用 Reg ex 的 SQL GROUP BY 名称
- ios - Unix dateTime 格式未在 swift 5 中正确转换
- php - 检查参数是否等于模型中定义的常量
- c - 括号对范围块有什么影响?
- ionic-framework - 如何在点之间画线并保存为坐标数组 IONIC
- java - 如何在 Java 中对函数外的代码使用条件编译?
- react-native - 如何在 React-Native 中检查对 Touch ID、Face ID、密码和模式锁定的支持
- sql-server - 如何将 SQL 命令转换为实体框架和 Lambda 表达式