2016-11-26 71 views
2

我正在使用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中工作的,那将会很好。

回答

1

您的观察结果是正确的:通过环境变量指定的值覆盖jar中yml文件中指定的值。 此行为与JHipster无关。 这是纯粹的弹簧靴。以下是订单如何覆盖订单的简要概述(from the spring doc

Spring Boot使用非常特殊的PropertySource命令,该命令旨在允许显式重写值。属性按以下顺序考虑:

  1. 在你的home目录Devtools全局设置属性(〜/ .spring启动-devtools.properties时devtools有效)。
  2. @TestPropertySource在您的测试上的注释。
  3. @ SpringBootTest#properties注释属性在您的测试。
  4. 命令行参数。
  5. 来自SPRING_APPLICATION_JSON的属性(内嵌在环境变量或系统属性中的JSON)
  6. ServletConfig init参数。
  7. ServletContext初始参数。
  8. 来自java:comp/env的JNDI属性。
  9. Java系统属性(System.getProperties())。
  10. OS环境变量。
  11. 仅具有随机属性的RandomValuePropertySource。*。
  12. 打包的罐子(应用 - {轮廓}的.properties和YAML变体)的罐(应用 - {轮廓}内包装
  13. 特定资料的应用程序的属性的外部配置文件特定的应用性能。属性和YAML变体)
  14. 打包jar(application.properties和YAML变体)之外的应用程序属性。
  15. 打包在jar中的应用程序属性(application.properties和YAML变体)。
  16. @PropertySource @Configuration类的注释。
  17. 默认属性(使用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容器。

+0

如果我理解正确,1)app.yml环境变量中的条目覆盖application-prod.yml属性。因此,application-prod.yml中的用户名和密码未被使用。 2)mysql.yml文件中的凭证用于启动docker服务并提供root用户凭证。那么,应用程序使用默认的根ceredentials连接到数据库? – Soumya

+0

但是,如果我希望我的应用程序使用不同的证书集(不是根),我应该在哪里提及它。我无法在application-prod.yml中提到它,因为mysql属性被覆盖。在我的情况下,即使在application-prod.yml中提供了错误的用户名/密码,docker映像似乎也会启动,这表明可能会使用mysql.yml的根证书。是这样吗 ? – Soumya

+0

1)正确 2)正确 我不认为你的应用程序正在使用默认的根凭证。可以说你的应用程序在开发模式下运行,它使用内存中的h2数据库? – duderoot

相关问题