我有两个spring应用程序共享同一个mysql数据库。当我在没有docker的情况下运行它们时,它们工作得非常好。我的主机是windows10professional。
应用程序属性
server.port=8085
spring.jpa.show-sql=true
spring.jackson.serialization.write-dates-as-timestamps=false
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306 /webDatabase?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=my-secret-pw
dockerfile文件
FROM openjdk:8-jdk-alpine
ADD target/web-spring-boot.jar web-spring-boot.jar
EXPOSE 8085
ENTRYPOINT ["java","-jar", "web-spring-boot.jar"]
我根据其他示例创建了docker-compose.yml。
version: '3'
services:
web:
build: ./web
ports:
- "8085:8085"
depends_on:
- "database"
solver:
build: ./solver
ports:
- "8095:8095"
depends_on:
- "database"
database:
image: "mysql:latest"
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
- MYSQL_DATABASE=webDatabase
healthcheck:
test: "/usr/bin/mysql --user=root --password=my-secret-pw --execute \"SHOW DATABASES;\""
interval: 10s
timeout: 20s
retries: 10
volumes:
logvolume01: {}
它没有´不起作用。启动后,只有mysql容器在运行。
下面是spring日志的部分输出
solver|2019-01-04 22:55:15.698 warn 1---[main]o.h.engine.jdbc.spi.sqlexceptionhelper:sql错误:0,sqlstate:08s01 solver|2019-01-04 22:55:15.698错误1---[main]o.h.engine.jdbc.spi.sqlexceptionhelper:communications link failure solver|solver|1 |成功发送到服务器的最后一个数据包是0毫秒前。驱动程序尚未从服务器接收到任何数据包。
配置中缺少什么?做 application.properties
在运行排版时是否忽略?
3条答案
按热度按时间h5qlskok1#
我终于可以运行这个应用程序了。
以下是配置
docker-compose.yml公司
svmlkihl2#
spring引导应用程序尝试连接到localhost:3306. 只要它们不在容器中运行,就可以正常工作。
当在容器中运行时,还尝试针对localhost建立连接(但这次是在spring boot docker容器中)。这显然失败了,因为在spring引导容器中没有mysql在运行。
mysql服务可以通过其别名(数据库)在docker网络中访问。
将spring.datasource.url重新配置为
这可以在application.properties中完成,也可以在docker compose文件中使用环境变量。
ruyhziif3#
不用在application.properties中硬编码mysql数据源字符串,您可以从docker compose配置传递它。此外,您正在使用docker compose中定义的服务名称“database”在application.properties中创建硬编码条目。
请避免这样做,请执行以下操作:
注意:您可以将任何spring boot公共应用程序属性转换为环境变量,方法是将点(.)替换为下划线(\)