我正在尝试建立一个依赖于docker-compose中名为 teste 的MySQL数据库的Spring Boot应用程序。发出 docker-compose up 之后,我得到:
Caused by: java.net.ConnectException: Connection refused (Connection refused)
我正在Linux Mint上运行,我的 docker-compose版本是1.23.2 ,我的 docker版本是18.09.0 。
application.properties
# 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
docker-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"]
先谢谢!
答案 0 :(得分:1)
您的配置看起来不错,我只建议您:
UILongPressGestureRecognizer
。在links: db
网络中没有价值user-defined bridge
连接,否则请删除数据库的端口公开端口-所有端口都自动在docker-compose
网络内部公开。 我认为问题在于数据库容器比网络启动需要更多的时间。 user-defined bridge
仅控制顺序,但不能保证您已准备好数据库。如果可能,请设置几次连接尝试或在Web容器中放入套接字等待过程。
答案 1 :(得分:1)
Docker compose始终以依赖关系顺序或文件中的顺序顺序(如果未给出)启动和停止容器。但是docker-compose不能保证它会一直等到依赖容器运行之后。您可以在refer处获取更多详细信息。因此,这里的问题是,当spring-mysql
容器尝试访问数据库时,数据库尚未准备就绪。因此,推荐的解决方案是您可以使用wait-for-it.sh或类似的脚本来以spring-mysql
来包装ENTRYPOINT
应用。
例如,如果您使用wait-for-it.sh
,则在将上述脚本复制到项目根目录后,应将Dockerfile中的ENTRYPOINT
更改为以下内容:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
还有两个要考虑的重要事项是: