使用Docker时Jhipster应用程序中的数据库连接

时间:2016-11-26 15:28:38

标签: jhipster

我正在使用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中运作的话会很好。

1 个答案:

答案 0 :(得分:2)

您的观察是正确的:在环境变量上指定的值将覆盖jar中yml文件中指定的值。 此行为与JHipster 无关。 这是纯粹的春季启动。以下是属性覆盖(from the spring doc

的顺序的简短概述

Spring Boot使用一个非常特殊的PropertySource命令,旨在允许合理地覆盖值。按以下顺序考虑属性:

  1. 您的主目录上的Devtools全局设置属性(当devtools处于活动状态时,〜/ .spring-boot-devtools.properties)。
  2. @TestPropertySource测试注释。
  3. 测试时的@ SpringBootTest#properties annotation属性。
  4. 命令行参数。
  5. 来自SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)
  6. ServletConfig init参数。
  7. ServletContext init参数。
  8. 来自java:comp / env。
  9. 的JNDI属性
  10. Java系统属性(System.getProperties())。
  11. 操作系统环境变量。
  12. 一个只有随机属性的RandomValuePropertySource。*。
  13. 打包jar之外的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)
  14. 打包在jar中的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)
  15. 打包jar之外的应用程序属性(application.properties和YAML变体)。
  16. 打包在jar中的应用程序属性(application.properties和YAML变体)。
  17. @Configuration类上的@PropertySource注释。
  18. 默认属性(使用SpringApplication.setDefaultProperties指定)。
  19. 您在此处发布的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容器。