2016-11-26 127 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

相關問題