使用Docker时Jhipster应用程序中的数据库连接
我正在使用Jhipster构建应用程序。 我的示例应用程序prod.yml看起来像下面由Jhipster使用Docker时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
...
当我运行没有搬运工,我得到一个MySQL错误,如果用户名/密码不正确,这是正常的应用程序提供。
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
但如果我正在使用泊坞窗图像相同的应用程序,并提供在泊坞窗撰写文件中的DB属性,在应用程序prod.yml文件的属性似乎被忽略。也就是说,即使应用程序属性文件中的数据库属性不正确,但在Docker撰写文件中提供了正确的值,应用程序在使用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
给出看来,在泊坞窗撰写文件中的环境变量,重写特性应用dev.yml文件。我的想法是否正确?
如果有人能够详细解释这是如何在jspeter中工作的,那将会很好。
您的观察结果是正确的:通过环境变量指定的值覆盖jar中yml文件中指定的值。 此行为与JHipster无关。 这是纯粹的弹簧靴。以下是订单如何覆盖订单的简要概述(from the spring doc)
Spring Boot使用非常特殊的PropertySource命令,该命令旨在允许显式重写值。属性按以下顺序考虑:
- 在你的home目录Devtools全局设置属性(〜/ .spring启动-devtools.properties时devtools有效)。
- @TestPropertySource在您的测试上的注释。
- @ SpringBootTest#properties注释属性在您的测试。
- 命令行参数。
- 来自SPRING_APPLICATION_JSON的属性(内嵌在环境变量或系统属性中的JSON)
- ServletConfig init参数。
- ServletContext初始参数。
- 来自java:comp/env的JNDI属性。
- Java系统属性(System.getProperties())。
- OS环境变量。
- 仅具有随机属性的RandomValuePropertySource。*。
- 打包的罐子(应用 - {轮廓}的.properties和YAML变体)的罐(应用 - {轮廓}内包装
- 特定资料的应用程序的属性的外部配置文件特定的应用性能。属性和YAML变体)
- 打包jar(application.properties和YAML变体)之外的应用程序属性。
- 打包在jar中的应用程序属性(application.properties和YAML变体)。
- @PropertySource @Configuration类的注释。
- 默认属性(使用SpringApplication.setDefaultProperties指定)。
您在此处发布的mysql docker的yml文件中的条目是作为Docker服务启动的RDMS mysql数据库的根用户的证书。这并不意味着您的应用程序将使用这些凭据。这可能是因为您在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
for spring正在覆盖您的application-prod.yml文件。同样重要的是,你的应用程序容器知道mysql容器。
如果我理解正确,1)app.yml环境变量中的条目覆盖application-prod.yml属性。因此,application-prod.yml中的用户名和密码未被使用。 2)mysql.yml文件中的凭证用于启动docker服务并提供root用户凭证。那么,应用程序使用默认的根ceredentials连接到数据库? – Soumya
但是,如果我希望我的应用程序使用不同的证书集(不是根),我应该在哪里提及它。我无法在application-prod.yml中提到它,因为mysql属性被覆盖。在我的情况下,即使在application-prod.yml中提供了错误的用户名/密码,docker映像似乎也会启动,这表明可能会使用mysql.yml的根证书。是这样吗 ? – Soumya
1)正确 2)正确 我不认为你的应用程序正在使用默认的根凭证。可以说你的应用程序在开发模式下运行,它使用内存中的h2数据库? – duderoot