我正在使用Jhipster构建应用程序。 我的示例application-prod.yml如下所示,由Jhipster提供
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/MyModule?useUnicode=true&characterEncoding=utf8&useSSL=false
name:
username: hello
password: hello
hikari:
data-source-properties:
...
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
database: MYSQL
show-sql: false
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
...
当我运行没有docker的应用程序时,如果用户名/密码不正确,我会收到mysql错误,这是正常的。
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
但是如果我使用docker image运行相同的应用程序并在docker compose文件中提供db属性,那么application-prod.yml文件中的属性似乎会被忽略。也就是说,即使应用程序属性文件中的数据库属性不正确,但在docker compose文件中提供了正确的值,当使用docker image运行时,应用程序似乎也能正常工作,并且可以连接到数据库。
docker文件中的条目如下所示
version: '2'
services:
mymodule-mysql:
container_name: mymodule-mysql
image: mysql:5.7.13
environment:
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ALLOW_EMPTY_PASSWORD=no
- MYSQL_DATABASE=mymodule
ports:
- 3306:3306
command: mysqld --lower_case_table_names=1 --skip-ssl
似乎docker compose文件中的环境变量覆盖了属性application-dev.yml文件。我的想法是否正确?
如果有人可以详细解释这是如何在jhipster中运作的话会很好。
答案 0 :(得分:2)
您的观察是正确的:在环境变量上指定的值将覆盖jar中yml文件中指定的值。 此行为与JHipster 无关。 这是纯粹的春季启动。以下是属性覆盖(from the spring doc)
的顺序的简短概述Spring Boot使用一个非常特殊的PropertySource命令,旨在允许合理地覆盖值。按以下顺序考虑属性:
您在此处发布的mysql docker的yml文件中的条目是RDMS mysql数据库的root用户的凭据,该数据库作为docker服务启动。这并不意味着您的应用程序将使用这些凭证。也许你在application-prod.yml文件中也有相同的凭证,这个文件在包装阶段已经添加到你的战争中,然后这场战争被放入你的码头工具中。
在用于启动docker-compose的app.yml文件中,您还应该有一些环境可变,例如
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/myDataBase?useUnicode=true&characterEncoding=utf8&useSSL=false
- JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
表示覆盖application-prod.yml文件的spring。也是importat,你的app容器知道mysql容器。